diff --git a/default-plugins/tab-bar/src/line.rs b/default-plugins/tab-bar/src/line.rs index cad5b720..3ebeaac3 100644 --- a/default-plugins/tab-bar/src/line.rs +++ b/default-plugins/tab-bar/src/line.rs @@ -144,8 +144,12 @@ fn add_next_tabs_msg( title_bar.push(right_more_message); } -fn tab_line_prefix(palette: Palette) -> LinePart { - let prefix_text = " Zellij ".to_string(); +fn tab_line_prefix(session_name: Option<&str>, palette: Palette) -> LinePart { + let mut prefix_text = " Zellij ".to_string(); + if let Some(name) = session_name { + prefix_text.push_str(&format!("({}) ", name)); + } + let prefix_text_len = prefix_text.chars().count(); let prefix_styled_text = style!(palette.white, palette.cyan) .bold() @@ -165,6 +169,7 @@ pub fn tab_separator(capabilities: PluginCapabilities) -> &'static str { } pub fn tab_line( + session_name: Option<&str>, mut all_tabs: Vec, active_tab_index: usize, cols: usize, @@ -181,7 +186,7 @@ pub fn tab_line( }; tabs_to_render.push(active_tab); - let prefix = tab_line_prefix(palette); + let prefix = tab_line_prefix(session_name, palette); populate_tabs_in_tab_line( &mut tabs_before_active, &mut tabs_after_active, diff --git a/default-plugins/tab-bar/src/main.rs b/default-plugins/tab-bar/src/main.rs index 1f83dcde..a185ccc3 100644 --- a/default-plugins/tab-bar/src/main.rs +++ b/default-plugins/tab-bar/src/main.rs @@ -64,6 +64,7 @@ impl ZellijPlugin for State { all_tabs.push(tab); } let tab_line = tab_line( + self.mode_info.session_name.as_deref(), all_tabs, active_tab_index, cols, diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index c96c1345..86ecd688 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -18,7 +18,7 @@ use crate::{ use zellij_tile::data::{Event, ModeInfo, Palette, PluginCapabilities, TabInfo}; use zellij_utils::{ errors::{ContextType, ScreenContext}, - input::options::Options, + input::{get_mode_info, options::Options}, ipc::ClientAttributes, pane_size::PositionAndSize, }; @@ -428,13 +428,13 @@ pub(crate) fn screen_thread_main( bus, &client_attributes, max_panes, - ModeInfo { - palette: client_attributes.palette, - capabilities: PluginCapabilities { + get_mode_info( + config_options.default_mode.unwrap_or_default(), + client_attributes.palette, + PluginCapabilities { arrow_fonts: capabilities, }, - ..ModeInfo::default() - }, + ), session_state, ); loop { diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index 4e4b6823..cdf57e69 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -148,6 +148,7 @@ pub struct ModeInfo { pub keybinds: Vec<(String, String)>, // => pub palette: Palette, pub capabilities: PluginCapabilities, + pub session_name: Option, } #[derive(Debug, Default, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)] diff --git a/zellij-utils/src/input/mod.rs b/zellij-utils/src/input/mod.rs index 11c5a843..746d5861 100644 --- a/zellij-utils/src/input/mod.rs +++ b/zellij-utils/src/input/mod.rs @@ -12,52 +12,48 @@ pub mod theme; use termion::input::TermRead; use zellij_tile::data::{InputMode, Key, ModeInfo, Palette, PluginCapabilities}; -/// Creates a [`Help`] struct indicating the current [`InputMode`] and its keybinds +/// Creates a [`ModeInfo`] struct indicating the current [`InputMode`] and its keybinds /// (as pairs of [`String`]s). -// TODO this should probably be automatically generated in some way pub fn get_mode_info( mode: InputMode, palette: Palette, capabilities: PluginCapabilities, ) -> ModeInfo { - let mut keybinds: Vec<(String, String)> = vec![]; - match mode { - InputMode::Normal | InputMode::Locked => {} - InputMode::Resize => { - keybinds.push(("←↓↑→".to_string(), "Resize".to_string())); - } - InputMode::Pane => { - keybinds.push(("←↓↑→".to_string(), "Move focus".to_string())); - keybinds.push(("p".to_string(), "Next".to_string())); - keybinds.push(("n".to_string(), "New".to_string())); - keybinds.push(("d".to_string(), "Down split".to_string())); - keybinds.push(("r".to_string(), "Right split".to_string())); - keybinds.push(("x".to_string(), "Close".to_string())); - keybinds.push(("f".to_string(), "Fullscreen".to_string())); - } - InputMode::Tab => { - keybinds.push(("←↓↑→".to_string(), "Move focus".to_string())); - keybinds.push(("n".to_string(), "New".to_string())); - keybinds.push(("x".to_string(), "Close".to_string())); - keybinds.push(("r".to_string(), "Rename".to_string())); - keybinds.push(("s".to_string(), "Sync".to_string())); - } - InputMode::Scroll => { - keybinds.push(("↓↑".to_string(), "Scroll".to_string())); - keybinds.push(("PgUp/PgDn".to_string(), "Scroll Page".to_string())); - } - InputMode::RenameTab => { - keybinds.push(("Enter".to_string(), "when done".to_string())); - } - InputMode::Session => { - keybinds.push(("d".to_string(), "Detach".to_string())); - } - } + let keybinds = match mode { + InputMode::Normal | InputMode::Locked => Vec::new(), + InputMode::Resize => vec![("←↓↑→".to_string(), "Resize".to_string())], + InputMode::Pane => vec![ + ("←↓↑→".to_string(), "Move focus".to_string()), + ("p".to_string(), "Next".to_string()), + ("n".to_string(), "New".to_string()), + ("d".to_string(), "Down split".to_string()), + ("r".to_string(), "Right split".to_string()), + ("x".to_string(), "Close".to_string()), + ("f".to_string(), "Fullscreen".to_string()), + ], + InputMode::Tab => vec![ + ("←↓↑→".to_string(), "Move focus".to_string()), + ("n".to_string(), "New".to_string()), + ("x".to_string(), "Close".to_string()), + ("r".to_string(), "Rename".to_string()), + ("s".to_string(), "Sync".to_string()), + ], + InputMode::Scroll => vec![ + ("↓↑".to_string(), "Scroll".to_string()), + ("PgUp/PgDn".to_string(), "Scroll Page".to_string()), + ], + InputMode::RenameTab => vec![("Enter".to_string(), "when done".to_string())], + InputMode::Session => vec![("d".to_string(), "Detach".to_string())], + }; + + let session_name = std::env::var("ZELLIJ_SESSION_NAME").ok(); + ModeInfo { mode, keybinds, palette, capabilities, + session_name, } }