aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src/screen.rs
diff options
context:
space:
mode:
authorAram Drevekenin <aram@poor.dev>2023-11-05 15:32:05 +0100
committerGitHub <noreply@github.com>2023-11-05 15:32:05 +0100
commit28a165a969a9e1ee9f1fe66e4d63134b895b2ef7 (patch)
tree678ec1cd9d536d9cb7fcdb071e27cf12caf43afb /zellij-server/src/screen.rs
parentdocs(changelog): styled underlines (diff)
downloadsl0ppij-28a165a969a9e1ee9f1fe66e4d63134b895b2ef7.tar.gz
sl0ppij-28a165a969a9e1ee9f1fe66e4d63134b895b2ef7.tar.xz
sl0ppij-28a165a969a9e1ee9f1fe66e4d63134b895b2ef7.zip
feat(ux): allow renaming sessions (#2903)
* change session name through the cli * change session name from the session-manager * style(fmt): rustfmt
Diffstat (limited to 'zellij-server/src/screen.rs')
-rw-r--r--zellij-server/src/screen.rs72
1 files changed, 71 insertions, 1 deletions
diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs
index fbc35566..1adc2b1a 100644
--- a/zellij-server/src/screen.rs
+++ b/zellij-server/src/screen.rs
@@ -15,6 +15,8 @@ use zellij_utils::input::command::RunCommand;
use zellij_utils::input::options::Clipboard;
use zellij_utils::pane_size::{Size, SizeInPixels};
use zellij_utils::{
+ consts::{session_info_folder_for_session, ZELLIJ_SOCK_DIR},
+ envs::set_session_name,
input::command::TerminalAction,
input::layout::{
FloatingPaneLayout, Layout, PluginUserConfiguration, Run, RunPlugin, RunPluginLocation,
@@ -314,6 +316,7 @@ pub enum ScreenInstruction {
ClientTabIndexOrPaneId,
),
DumpLayoutToHd,
+ RenameSession(String, ClientId), // String -> new name
}
impl From<&ScreenInstruction> for ScreenContext {
@@ -492,6 +495,7 @@ impl From<&ScreenInstruction> for ScreenContext {
ScreenInstruction::ReplacePane(..) => ScreenContext::ReplacePane,
ScreenInstruction::NewInPlacePluginPane(..) => ScreenContext::NewInPlacePluginPane,
ScreenInstruction::DumpLayoutToHd => ScreenContext::DumpLayoutToHd,
+ ScreenInstruction::RenameSession(..) => ScreenContext::RenameSession,
}
}
}
@@ -1520,7 +1524,10 @@ impl Screen {
}
}
- pub fn change_mode(&mut self, mode_info: ModeInfo, client_id: ClientId) -> Result<()> {
+ pub fn change_mode(&mut self, mut mode_info: ModeInfo, client_id: ClientId) -> Result<()> {
+ if mode_info.session_name.as_ref() != Some(&self.session_name) {
+ mode_info.session_name = Some(self.session_name.clone());
+ }
let previous_mode = self
.mode_info
.get(&client_id)
@@ -3471,6 +3478,69 @@ pub(crate) fn screen_thread_main(
screen.dump_layout_to_hd()?;
}
},
+ ScreenInstruction::RenameSession(name, client_id) => {
+ if screen.session_infos_on_machine.contains_key(&name) {
+ let error_text = "A session by this name already exists.";
+ log::error!("{}", error_text);
+ if let Some(os_input) = &mut screen.bus.os_input {
+ let _ = os_input.send_to_client(
+ client_id,
+ ServerToClientMsg::LogError(vec![error_text.to_owned()]),
+ );
+ }
+ } else if screen.resurrectable_sessions.contains_key(&name) {
+ let error_text =
+ "A resurrectable session by this name exists, cannot use this name.";
+ log::error!("{}", error_text);
+ if let Some(os_input) = &mut screen.bus.os_input {
+ let _ = os_input.send_to_client(
+ client_id,
+ ServerToClientMsg::LogError(vec![error_text.to_owned()]),
+ );
+ }
+ } else {
+ let err_context = || format!("Failed to rename session");
+ let old_session_name = screen.session_name.clone();
+
+ // update state
+ screen.session_name = name.clone();
+ screen.default_mode_info.session_name = Some(name.clone());
+ for (_client_id, mut mode_info) in screen.mode_info.iter_mut() {
+ mode_info.session_name = Some(name.clone());
+ }
+ for (_, tab) in screen.tabs.iter_mut() {
+ tab.rename_session(name.clone()).with_context(err_context)?;
+ }
+
+ // rename socket file
+ let old_socket_file_path = ZELLIJ_SOCK_DIR.join(&old_session_name);
+ let new_socket_file_path = ZELLIJ_SOCK_DIR.join(&name);
+ if let Err(e) = std::fs::rename(old_socket_file_path, new_socket_file_path) {
+ log::error!("Failed to rename ipc socket: {:?}", e);
+ }
+
+ // rename session_info folder (TODO: make this atomic, right now there is a
+ // chance background_jobs will re-create this folder before it knows the
+ // session was renamed)
+ let old_session_info_folder =
+ session_info_folder_for_session(&old_session_name);
+ let new_session_info_folder = session_info_folder_for_session(&name);
+ if let Err(e) =
+ std::fs::rename(old_session_info_folder, new_session_info_folder)
+ {
+ log::error!("Failed to rename session_info folder: {:?}", e);
+ }
+
+ // report
+ screen
+ .log_and_report_session_state()
+ .with_context(err_context)?;
+
+ // set the env variable
+ set_session_name(name);
+ }
+ screen.unblock_input()?;
+ },
}
}
Ok(())