From e2081f26494df7921208060199ab4122ee8695d2 Mon Sep 17 00:00:00 2001 From: Kerfuffle <44031344+KerfuffleV2@users.noreply.github.com> Date: Mon, 28 Feb 2022 09:54:41 -0700 Subject: [PATCH] fix: Allow terminal title passthrough even when not drawing pane frames. (#1113) * fix: Allow terminal title passthrough even when not drawing pane frames. * Minor formatting fix. * Handle case where the session name is not set. --- zellij-server/src/panes/plugin_pane.rs | 11 +++++++++++ zellij-server/src/panes/terminal_pane.rs | 11 +++++++++++ zellij-server/src/tab/mod.rs | 2 ++ zellij-server/src/ui/pane_boundaries_frame.rs | 13 ++----------- zellij-server/src/ui/pane_contents_and_ui.rs | 9 ++++++++- zellij-utils/src/shared.rs | 11 +++++++++++ 6 files changed, 45 insertions(+), 12 deletions(-) diff --git a/zellij-server/src/panes/plugin_pane.rs b/zellij-server/src/panes/plugin_pane.rs index 888a2076..2f725b8f 100644 --- a/zellij-server/src/panes/plugin_pane.rs +++ b/zellij-server/src/panes/plugin_pane.rs @@ -16,6 +16,7 @@ use zellij_utils::zellij_tile::prelude::{Event, InputMode, Mouse, PaletteColor}; use zellij_utils::{ channels::SenderWithContext, pane_size::{Dimension, PaneGeom}, + shared::make_terminal_title, }; pub(crate) struct PluginPane { @@ -253,6 +254,16 @@ impl Pane for PluginPane { ) -> Option { None } + fn render_terminal_title(&mut self, input_mode: InputMode) -> String { + let pane_title = if self.pane_name.is_empty() && input_mode == InputMode::RenamePane { + "Enter name..." + } else if self.pane_name.is_empty() { + &self.pane_title + } else { + &self.pane_name + }; + make_terminal_title(pane_title) + } fn update_name(&mut self, name: &str) { match name { "\0" => { diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index e2f5de23..a4460173 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -17,6 +17,7 @@ use zellij_utils::pane_size::Offset; use zellij_utils::{ pane_size::{Dimension, PaneGeom}, position::Position, + shared::make_terminal_title, vte, zellij_tile::data::{InputMode, Palette, PaletteColor}, }; @@ -303,6 +304,16 @@ impl Pane for TerminalPane { } vte_output } + fn render_terminal_title(&mut self, input_mode: InputMode) -> String { + let pane_title = if self.pane_name.is_empty() && input_mode == InputMode::RenamePane { + "Enter name..." + } else if self.pane_name.is_empty() { + self.grid.title.as_deref().unwrap_or(&self.pane_title) + } else { + &self.pane_name + }; + make_terminal_title(pane_title) + } fn update_name(&mut self, name: &str) { match name { "\0" => { diff --git a/zellij-server/src/tab/mod.rs b/zellij-server/src/tab/mod.rs index c62eba22..5b4c8e09 100644 --- a/zellij-server/src/tab/mod.rs +++ b/zellij-server/src/tab/mod.rs @@ -169,6 +169,7 @@ pub trait Pane { cursor_color: PaletteColor, text_color: PaletteColor, ) -> Option; + fn render_terminal_title(&mut self, _input_mode: InputMode) -> String; fn update_name(&mut self, name: &str); fn pid(&self) -> PaneId; fn reduce_height(&mut self, percent: f64); @@ -1225,6 +1226,7 @@ impl Tab { self.session_is_mirrored, ); } + pane_contents_and_ui.render_terminal_title_if_needed(client_id, client_mode); // this is done for panes that don't have their own cursor (eg. panes of // another user) pane_contents_and_ui.render_fake_cursor_if_needed(client_id); diff --git a/zellij-server/src/ui/pane_boundaries_frame.rs b/zellij-server/src/ui/pane_boundaries_frame.rs index 07cae4ac..28f6112b 100644 --- a/zellij-server/src/ui/pane_boundaries_frame.rs +++ b/zellij-server/src/ui/pane_boundaries_frame.rs @@ -2,8 +2,8 @@ use crate::output::CharacterChunk; use crate::panes::{AnsiCode, CharacterStyles, TerminalCharacter, EMPTY_TERMINAL_CHARACTER}; use crate::ui::boundaries::boundary_type; use crate::ClientId; +use zellij_utils::pane_size::Viewport; use zellij_utils::zellij_tile::prelude::{client_id_to_colors, Palette, PaletteColor}; -use zellij_utils::{envs::get_session_name, pane_size::Viewport}; use unicode_width::{UnicodeWidthChar, UnicodeWidthStr}; @@ -603,15 +603,6 @@ impl PaneFrame { character_chunks.push(CharacterChunk::new(boundary_character_right, x, y)); } } - let vte_output = if self.is_main_client { - Some(format!( - "\u{1b}]0;Zellij ({}) - {}\u{07}", - get_session_name().unwrap(), - self.title - )) - } else { - None - }; - (character_chunks, vte_output) + (character_chunks, None) } } diff --git a/zellij-server/src/ui/pane_contents_and_ui.rs b/zellij-server/src/ui/pane_contents_and_ui.rs index 5e3ee9b9..61b0e354 100644 --- a/zellij-server/src/ui/pane_contents_and_ui.rs +++ b/zellij-server/src/ui/pane_contents_and_ui.rs @@ -8,7 +8,6 @@ use std::collections::HashMap; use zellij_tile::data::{ client_id_to_colors, single_client_color, InputMode, Palette, PaletteColor, }; - pub struct PaneContentsAndUi<'a> { pane: &'a mut Box, output: &'a mut Output, @@ -111,6 +110,14 @@ impl<'a> PaneContentsAndUi<'a> { } } } + pub fn render_terminal_title_if_needed(&mut self, client_id: ClientId, client_mode: InputMode) { + if !self.focused_clients.contains(&client_id) { + return; + } + let vte_output = self.pane.render_terminal_title(client_mode); + self.output + .add_post_vte_instruction_to_client(client_id, &vte_output); + } pub fn render_pane_frame( &mut self, client_id: ClientId, diff --git a/zellij-utils/src/shared.rs b/zellij-utils/src/shared.rs index 79695435..ffb164f6 100644 --- a/zellij-utils/src/shared.rs +++ b/zellij-utils/src/shared.rs @@ -2,6 +2,7 @@ use std::{iter, str::from_utf8}; +use crate::envs::get_session_name; use colorsys::Rgb; use std::os::unix::fs::PermissionsExt; use std::path::Path; @@ -40,6 +41,16 @@ pub fn adjust_to_size(s: &str, rows: usize, columns: usize) -> String { .join("\n\r") } +pub fn make_terminal_title(pane_title: &str) -> String { + format!( + "\u{1b}]0;Zellij {}- {}\u{07}", + get_session_name() + .map(|n| format!("({}) ", n)) + .unwrap_or_default(), + pane_title, + ) +} + // Colors pub mod colors { pub const WHITE: u8 = 255;