diff --git a/Cargo.lock b/Cargo.lock index bb23c131..e446df9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2244,6 +2244,7 @@ dependencies = [ name = "zellij" version = "0.2.1" dependencies = [ + "ansi_term 0.12.1", "async-std", "backtrace", "bincode", diff --git a/Cargo.toml b/Cargo.toml index fec3c7b2..d83100ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ publish = [] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +ansi_term = "0.12.1" backtrace = "0.3.55" bincode = "1.3.1" directories-next = "2.0" diff --git a/src/client/boundaries.rs b/src/client/boundaries.rs index 67733c12..e498da89 100644 --- a/src/client/boundaries.rs +++ b/src/client/boundaries.rs @@ -1,5 +1,7 @@ use crate::tab::Pane; +use ansi_term::Colour; use std::collections::HashMap; +use zellij_tile::data::InputMode; use std::fmt::{Display, Error, Formatter}; @@ -17,12 +19,20 @@ pub mod boundary_type { pub const CROSS: &str = "┼"; } +pub mod colors { + use ansi_term::Colour::{self, Fixed}; + pub const WHITE: Colour = Fixed(255); + pub const GREEN: Colour = Fixed(154); + pub const GRAY: Colour = Fixed(238); +} + pub type BoundaryType = &'static str; // easy way to refer to boundary_type above #[derive(Clone, Copy, Debug)] pub struct BoundarySymbol { boundary_type: BoundaryType, invisible: bool, + color: Option, } impl BoundarySymbol { @@ -30,20 +40,27 @@ impl BoundarySymbol { BoundarySymbol { boundary_type, invisible: false, + color: Some(colors::GRAY), } } pub fn invisible(mut self) -> Self { self.invisible = true; self } + pub fn color(&mut self, color: Option) -> Self { + self.color = color; + *self + } } impl Display for BoundarySymbol { fn fmt(&self, f: &mut Formatter) -> Result<(), Error> { - if self.invisible { - write!(f, " ") - } else { - write!(f, "{}", self.boundary_type) + match self.invisible { + true => write!(f, " "), + false => match self.color { + Some(color) => write!(f, "{}", color.paint(self.boundary_type)), + None => write!(f, "{}", self.boundary_type), + }, } } } @@ -53,6 +70,10 @@ fn combine_symbols( next_symbol: BoundarySymbol, ) -> Option { let invisible = current_symbol.invisible || next_symbol.invisible; + let color = match (current_symbol.color.is_some(), next_symbol.color.is_some()) { + (true, _) => current_symbol.color, + _ => next_symbol.color, + }; let current_symbol = current_symbol.boundary_type; let next_symbol = next_symbol.boundary_type; match (current_symbol, next_symbol) { @@ -62,6 +83,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::VERTICAL) => { @@ -70,6 +92,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::HORIZONTAL) => { @@ -78,6 +101,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::TOP_LEFT) => { @@ -86,6 +110,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::BOTTOM_RIGHT) => { @@ -94,6 +119,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::BOTTOM_LEFT) => { @@ -102,6 +128,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::VERTICAL_LEFT) => { @@ -110,6 +137,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::VERTICAL_RIGHT) => { @@ -118,6 +146,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::HORIZONTAL_DOWN) => { @@ -126,6 +155,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::HORIZONTAL_UP) => { @@ -134,6 +164,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_RIGHT, boundary_type::CROSS) => { @@ -142,6 +173,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::HORIZONTAL) => { @@ -150,6 +182,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::VERTICAL) => { @@ -158,6 +191,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::TOP_LEFT) => { @@ -166,6 +200,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::BOTTOM_RIGHT) => { @@ -174,6 +209,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::BOTTOM_LEFT) => { @@ -182,6 +218,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::VERTICAL_LEFT) => { @@ -190,6 +227,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::VERTICAL_RIGHT) => { @@ -198,6 +236,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::HORIZONTAL_DOWN) => { @@ -206,6 +245,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::HORIZONTAL_UP) => { @@ -214,6 +254,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL, boundary_type::CROSS) => { @@ -222,6 +263,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::VERTICAL) => { @@ -230,6 +272,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::TOP_LEFT) => { @@ -238,6 +281,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::BOTTOM_RIGHT) => { @@ -246,6 +290,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::BOTTOM_LEFT) => { @@ -254,6 +299,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::VERTICAL_LEFT) => { @@ -262,6 +308,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::VERTICAL_RIGHT) => { @@ -270,6 +317,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::HORIZONTAL_DOWN) => { @@ -278,6 +326,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::HORIZONTAL_UP) => { @@ -286,6 +335,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL, boundary_type::CROSS) => { @@ -294,6 +344,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::TOP_LEFT) => { @@ -302,6 +353,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::BOTTOM_RIGHT) => { @@ -310,6 +362,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::BOTTOM_LEFT) => { @@ -318,6 +371,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::VERTICAL_LEFT) => { @@ -326,6 +380,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::VERTICAL_RIGHT) => { @@ -334,6 +389,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::HORIZONTAL_DOWN) => { @@ -342,6 +398,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::HORIZONTAL_UP) => { @@ -350,6 +407,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::TOP_LEFT, boundary_type::CROSS) => { @@ -358,6 +416,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::BOTTOM_RIGHT) => { @@ -366,6 +425,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::BOTTOM_LEFT) => { @@ -374,6 +434,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::VERTICAL_LEFT) => { @@ -382,6 +443,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::VERTICAL_RIGHT) => { @@ -390,6 +452,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::HORIZONTAL_DOWN) => { @@ -398,6 +461,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::HORIZONTAL_UP) => { @@ -406,6 +470,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_RIGHT, boundary_type::CROSS) => { @@ -414,6 +479,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_LEFT, boundary_type::BOTTOM_LEFT) => { @@ -422,6 +488,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_LEFT, boundary_type::VERTICAL_LEFT) => { @@ -430,6 +497,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_LEFT, boundary_type::VERTICAL_RIGHT) => { @@ -438,6 +506,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_LEFT, boundary_type::HORIZONTAL_DOWN) => { @@ -446,6 +515,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_LEFT, boundary_type::HORIZONTAL_UP) => { @@ -454,6 +524,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::BOTTOM_LEFT, boundary_type::CROSS) => { @@ -462,6 +533,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_LEFT, boundary_type::VERTICAL_LEFT) => { @@ -470,6 +542,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_LEFT, boundary_type::VERTICAL_RIGHT) => { @@ -478,6 +551,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_LEFT, boundary_type::HORIZONTAL_DOWN) => { @@ -486,6 +560,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_LEFT, boundary_type::HORIZONTAL_UP) => { @@ -494,6 +569,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_LEFT, boundary_type::CROSS) => { @@ -502,6 +578,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_RIGHT, boundary_type::VERTICAL_RIGHT) => { @@ -510,6 +587,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_RIGHT, boundary_type::HORIZONTAL_DOWN) => { @@ -518,6 +596,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_RIGHT, boundary_type::HORIZONTAL_UP) => { @@ -526,6 +605,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::VERTICAL_RIGHT, boundary_type::CROSS) => { @@ -534,6 +614,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL_DOWN, boundary_type::HORIZONTAL_DOWN) => { @@ -542,6 +623,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL_DOWN, boundary_type::HORIZONTAL_UP) => { @@ -550,6 +632,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL_DOWN, boundary_type::CROSS) => { @@ -558,6 +641,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL_UP, boundary_type::HORIZONTAL_UP) => { @@ -566,6 +650,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::HORIZONTAL_UP, boundary_type::CROSS) => { @@ -574,6 +659,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (boundary_type::CROSS, boundary_type::CROSS) => { @@ -582,6 +668,7 @@ fn combine_symbols( Some(BoundarySymbol { boundary_type, invisible, + color, }) } (_, _) => None, @@ -677,7 +764,14 @@ impl Boundaries { boundary_characters: HashMap::new(), } } - pub fn add_rect(&mut self, rect: &dyn Pane) { + pub fn add_rect(&mut self, rect: &dyn Pane, input_mode: InputMode, color: Option) { + let color = match color.is_some() { + true => match input_mode { + InputMode::Normal | InputMode::Locked => Some(colors::GREEN), + _ => Some(colors::WHITE), + }, + false => None, + }; if rect.x() > 0 { let boundary_x_coords = rect.x() - 1; let first_row_coordinates = self.rect_right_boundary_row_start(rect); @@ -685,11 +779,11 @@ impl Boundaries { for row in first_row_coordinates..last_row_coordinates { let coordinates = Coordinates::new(boundary_x_coords, row); let mut symbol_to_add = if row == first_row_coordinates && row != 0 { - BoundarySymbol::new(boundary_type::TOP_LEFT) + BoundarySymbol::new(boundary_type::TOP_LEFT).color(color) } else if row == last_row_coordinates - 1 && row != self.rows - 1 { - BoundarySymbol::new(boundary_type::BOTTOM_LEFT) + BoundarySymbol::new(boundary_type::BOTTOM_LEFT).color(color) } else { - BoundarySymbol::new(boundary_type::VERTICAL) + BoundarySymbol::new(boundary_type::VERTICAL).color(color) }; if rect.invisible_borders() { symbol_to_add = symbol_to_add.invisible(); @@ -709,11 +803,11 @@ impl Boundaries { for col in first_col_coordinates..last_col_coordinates { let coordinates = Coordinates::new(col, boundary_y_coords); let mut symbol_to_add = if col == first_col_coordinates && col != 0 { - BoundarySymbol::new(boundary_type::TOP_LEFT) + BoundarySymbol::new(boundary_type::TOP_LEFT).color(color) } else if col == last_col_coordinates - 1 && col != self.columns - 1 { - BoundarySymbol::new(boundary_type::TOP_RIGHT) + BoundarySymbol::new(boundary_type::TOP_RIGHT).color(color) } else { - BoundarySymbol::new(boundary_type::HORIZONTAL) + BoundarySymbol::new(boundary_type::HORIZONTAL).color(color) }; if rect.invisible_borders() { symbol_to_add = symbol_to_add.invisible(); @@ -734,11 +828,11 @@ impl Boundaries { for row in first_row_coordinates..last_row_coordinates { let coordinates = Coordinates::new(boundary_x_coords, row); let mut symbol_to_add = if row == first_row_coordinates && row != 0 { - BoundarySymbol::new(boundary_type::TOP_RIGHT) + BoundarySymbol::new(boundary_type::TOP_RIGHT).color(color) } else if row == last_row_coordinates - 1 && row != self.rows - 1 { - BoundarySymbol::new(boundary_type::BOTTOM_RIGHT) + BoundarySymbol::new(boundary_type::BOTTOM_RIGHT).color(color) } else { - BoundarySymbol::new(boundary_type::VERTICAL) + BoundarySymbol::new(boundary_type::VERTICAL).color(color) }; if rect.invisible_borders() { symbol_to_add = symbol_to_add.invisible(); @@ -758,11 +852,11 @@ impl Boundaries { for col in first_col_coordinates..last_col_coordinates { let coordinates = Coordinates::new(col, boundary_y_coords); let mut symbol_to_add = if col == first_col_coordinates && col != 0 { - BoundarySymbol::new(boundary_type::BOTTOM_LEFT) + BoundarySymbol::new(boundary_type::BOTTOM_LEFT).color(color) } else if col == last_col_coordinates - 1 && col != self.columns - 1 { - BoundarySymbol::new(boundary_type::BOTTOM_RIGHT) + BoundarySymbol::new(boundary_type::BOTTOM_RIGHT).color(color) } else { - BoundarySymbol::new(boundary_type::HORIZONTAL) + BoundarySymbol::new(boundary_type::HORIZONTAL).color(color) }; if rect.invisible_borders() { symbol_to_add = symbol_to_add.invisible(); diff --git a/src/client/panes/terminal_pane.rs b/src/client/panes/terminal_pane.rs index 9fa70d11..f0b15e50 100644 --- a/src/client/panes/terminal_pane.rs +++ b/src/client/panes/terminal_pane.rs @@ -188,7 +188,14 @@ impl Pane for TerminalPane { self.max_height } fn render(&mut self) -> Option { - if self.should_render || cfg!(test) { + // FIXME: + // the below conditional is commented out because it causes several bugs: + // 1. When panes are resized or tabs are switched the previous contents of the screen stick + // around + // 2. When there are wide characters in a pane, since we don't yet handle them properly, + // the spill over to the pane to the right + // if self.should_render || cfg!(test) { + if true { let mut vte_output = String::new(); let buffer_lines = &self.read_buffer_as_lines(); let display_cols = self.get_columns(); diff --git a/src/client/tab.rs b/src/client/tab.rs index 1a3f411d..b74c2eb7 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -1,6 +1,7 @@ //! `Tab`s holds multiple panes. It tracks their coordinates (x/y) and size, //! as well as how they should be resized +use crate::boundaries::colors; use crate::common::{input::handler::parse_keys, AppInstruction, SenderWithContext}; use crate::layout::Layout; use crate::panes::{PaneId, PositionAndSize, TerminalPane}; @@ -14,7 +15,7 @@ use std::{ collections::{BTreeMap, HashSet}, }; use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::Event; +use zellij_tile::data::{Event, InputMode}; const CURSOR_HEIGHT_WIDTH_RATIO: usize = 4; // this is not accurate and kind of a magic number, TODO: look into this const MIN_TERMINAL_HEIGHT: usize = 2; @@ -65,6 +66,7 @@ pub struct Tab { pub send_plugin_instructions: SenderWithContext, pub send_app_instructions: SenderWithContext, expansion_boundary: Option, + pub input_mode: InputMode, } // FIXME: Use a struct that has a pane_type enum, to reduce all of the duplication @@ -181,6 +183,7 @@ impl Tab { send_app_instructions: SenderWithContext, max_panes: Option, pane_id: Option, + input_mode: InputMode, ) -> Self { let panes = if let Some(PaneId::Terminal(pid)) = pane_id { let new_terminal = TerminalPane::new(pid, *full_screen_ws); @@ -210,6 +213,7 @@ impl Tab { send_pty_instructions, send_plugin_instructions, expansion_boundary: None, + input_mode, } } @@ -636,7 +640,12 @@ impl Tab { .expect("cannot write to stdout"); for (kind, terminal) in self.panes.iter_mut() { if !self.panes_to_hide.contains(&terminal.pid()) { - boundaries.add_rect(terminal.as_ref()); + match self.active_terminal.unwrap() == terminal.pid() { + true => { + boundaries.add_rect(terminal.as_ref(), self.input_mode, Some(colors::GREEN)) + } + false => boundaries.add_rect(terminal.as_ref(), self.input_mode, None), + } if let Some(vte_output) = terminal.render() { let vte_output = if let PaneId::Terminal(_) = kind { vte_output diff --git a/src/common/errors.rs b/src/common/errors.rs index b12a57a1..9afa694f 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -200,6 +200,7 @@ pub enum ScreenContext { CloseTab, GoToTab, UpdateTabName, + ChangeInputMode, } // FIXME: Just deriving EnumDiscriminants from strum will remove the need for any of this!!! @@ -240,6 +241,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::CloseTab => ScreenContext::CloseTab, ScreenInstruction::GoToTab(_) => ScreenContext::GoToTab, ScreenInstruction::UpdateTabName(_) => ScreenContext::UpdateTabName, + ScreenInstruction::ChangeInputMode(_) => ScreenContext::ChangeInputMode, } } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index 4b948cbf..f48ec7c9 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -131,6 +131,9 @@ impl InputHandler { update_state(&self.send_app_instructions, |_| AppState { input_mode: self.mode, }); + self.send_screen_instructions + .send(ScreenInstruction::ChangeInputMode(self.mode)) + .unwrap(); self.send_screen_instructions .send(ScreenInstruction::Render) .unwrap(); diff --git a/src/common/mod.rs b/src/common/mod.rs index add50d47..d8957003 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -295,6 +295,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { &full_screen_ws, os_input, max_panes, + InputMode::Normal, ); loop { let (event, mut err_ctx) = screen @@ -429,6 +430,9 @@ pub fn start(mut os_input: Box, opts: CliArgs) { ScreenInstruction::UpdateTabName(c) => { screen.update_active_tab_name(c); } + ScreenInstruction::ChangeInputMode(input_mode) => { + screen.change_input_mode(input_mode); + } ScreenInstruction::Quit => { break; } diff --git a/src/common/screen.rs b/src/common/screen.rs index 57d893c9..89205f73 100644 --- a/src/common/screen.rs +++ b/src/common/screen.rs @@ -13,7 +13,7 @@ use crate::tab::Tab; use crate::{errors::ErrorContext, wasm_vm::PluginInstruction}; use crate::{layout::Layout, panes::PaneId}; -use zellij_tile::data::TabInfo; +use zellij_tile::data::{InputMode, TabInfo}; /// Instructions that can be sent to the [`Screen`]. #[derive(Debug, Clone)] @@ -50,6 +50,7 @@ pub enum ScreenInstruction { CloseTab, GoToTab(u32), UpdateTabName(Vec), + ChangeInputMode(InputMode), } /// A [`Screen`] holds multiple [`Tab`]s, each one holding multiple [`panes`](crate::client::panes). @@ -74,6 +75,7 @@ pub struct Screen { /// The [`OsApi`] this [`Screen`] uses. os_api: Box, tabname_buf: String, + input_mode: InputMode, } impl Screen { @@ -86,6 +88,7 @@ impl Screen { full_screen_ws: &PositionAndSize, os_api: Box, max_panes: Option, + input_mode: InputMode, ) -> Self { Screen { receiver: receive_screen_instructions, @@ -98,6 +101,7 @@ impl Screen { tabs: BTreeMap::new(), os_api, tabname_buf: String::new(), + input_mode, } } @@ -117,6 +121,7 @@ impl Screen { self.send_app_instructions.clone(), self.max_panes, Some(PaneId::Terminal(pane_id)), + self.input_mode, ); self.active_tab_index = Some(tab_index); self.tabs.insert(tab_index, tab); @@ -258,6 +263,7 @@ impl Screen { self.send_app_instructions.clone(), self.max_panes, None, + self.input_mode, ); tab.apply_layout(layout, new_pids); self.active_tab_index = Some(tab_index); @@ -302,4 +308,10 @@ impl Screen { } } } + pub fn change_input_mode(&mut self, input_mode: InputMode) { + self.input_mode = input_mode; + for tab in self.tabs.values_mut() { + tab.input_mode = self.input_mode; + } + } }