diff --git a/src/client/tab.rs b/src/client/tab.rs index 33a25446..4121edba 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -14,7 +14,7 @@ use std::{ collections::{BTreeMap, HashSet}, }; use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::{Event, InputMode, Palette}; +use zellij_tile::data::{Event, InputMode, ModeInfo, Palette}; 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 +65,7 @@ pub struct Tab { pub send_plugin_instructions: SenderWithContext, pub send_app_instructions: SenderWithContext, expansion_boundary: Option, + pub mode_info: ModeInfo, pub input_mode: InputMode, pub colors: Palette, } @@ -183,6 +184,7 @@ impl Tab { send_app_instructions: SenderWithContext, max_panes: Option, pane_id: Option, + mode_info: ModeInfo, input_mode: InputMode, colors: Palette, ) -> Self { @@ -214,6 +216,7 @@ impl Tab { send_pty_instructions, send_plugin_instructions, expansion_boundary: None, + mode_info, input_mode, colors, } @@ -269,6 +272,13 @@ impl Tab { self.send_plugin_instructions.clone(), ); self.panes.insert(PaneId::Plugin(pid), Box::new(new_plugin)); + // Send an initial mode update to the newly loaded plugin only! + self.send_plugin_instructions + .send(PluginInstruction::Update( + Some(pid), + Event::ModeUpdate(self.mode_info.clone()), + )) + .unwrap(); } else { // there are still panes left to fill, use the pids we received in this method let pid = new_pids.next().unwrap(); // if this crashes it means we got less pids than there are panes in this layout @@ -628,10 +638,12 @@ impl Tab { for (kind, terminal) in self.panes.iter_mut() { if !self.panes_to_hide.contains(&terminal.pid()) { match self.active_terminal.unwrap() == terminal.pid() { - true => { - boundaries.add_rect(terminal.as_ref(), self.input_mode, Some(self.colors)) - } - false => boundaries.add_rect(terminal.as_ref(), self.input_mode, None), + true => boundaries.add_rect( + terminal.as_ref(), + self.mode_info.mode, + Some(self.colors), + ), + false => boundaries.add_rect(terminal.as_ref(), self.mode_info.mode, None), } if let Some(vte_output) = terminal.render() { let vte_output = if let PaneId::Terminal(_) = kind { diff --git a/src/common/errors.rs b/src/common/errors.rs index f5aeae85..56bf27f4 100644 --- a/src/common/errors.rs +++ b/src/common/errors.rs @@ -200,7 +200,7 @@ pub enum ScreenContext { CloseTab, GoToTab, UpdateTabName, - ChangeInputMode, + ChangeMode, } // FIXME: Just deriving EnumDiscriminants from strum will remove the need for any of this!!! @@ -241,7 +241,7 @@ impl From<&ScreenInstruction> for ScreenContext { ScreenInstruction::CloseTab => ScreenContext::CloseTab, ScreenInstruction::GoToTab(_) => ScreenContext::GoToTab, ScreenInstruction::UpdateTabName(_) => ScreenContext::UpdateTabName, - ScreenInstruction::ChangeInputMode(_) => ScreenContext::ChangeInputMode, + ScreenInstruction::ChangeMode(_) => ScreenContext::ChangeMode, } } } diff --git a/src/common/input/handler.rs b/src/common/input/handler.rs index a843c7cc..c2f9ce93 100644 --- a/src/common/input/handler.rs +++ b/src/common/input/handler.rs @@ -130,7 +130,7 @@ impl InputHandler { )) .unwrap(); self.send_screen_instructions - .send(ScreenInstruction::ChangeInputMode(mode)) + .send(ScreenInstruction::ChangeMode(get_mode_info(mode))) .unwrap(); self.send_screen_instructions .send(ScreenInstruction::Render) diff --git a/src/common/mod.rs b/src/common/mod.rs index 1d9345b8..38f3b533 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -39,7 +39,7 @@ use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction} use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; use xrdb::Colors; -use zellij_tile::data::{EventType, InputMode, Palette}; +use zellij_tile::data::{EventType, InputMode, ModeInfo, Palette}; #[derive(Serialize, Deserialize, Debug)] pub enum ApiCommand { @@ -321,6 +321,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { &full_screen_ws, os_input, max_panes, + ModeInfo::default(), InputMode::Normal, colors, ); @@ -455,8 +456,8 @@ 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::ChangeMode(mode_info) => { + screen.change_mode(mode_info); } ScreenInstruction::Quit => { break; diff --git a/src/common/screen.rs b/src/common/screen.rs index e11b734d..bd8a72c9 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::{Event, InputMode, Palette, TabInfo}; +use zellij_tile::data::{Event, InputMode, ModeInfo, Palette, TabInfo}; /// Instructions that can be sent to the [`Screen`]. #[derive(Debug, Clone)] @@ -50,7 +50,7 @@ pub enum ScreenInstruction { CloseTab, GoToTab(u32), UpdateTabName(Vec), - ChangeInputMode(InputMode), + ChangeMode(ModeInfo), } /// A [`Screen`] holds multiple [`Tab`]s, each one holding multiple [`panes`](crate::client::panes). @@ -74,6 +74,7 @@ pub struct Screen { active_tab_index: Option, /// The [`OsApi`] this [`Screen`] uses. os_api: Box, + mode_info: ModeInfo, input_mode: InputMode, colors: Palette, } @@ -88,6 +89,7 @@ impl Screen { full_screen_ws: &PositionAndSize, os_api: Box, max_panes: Option, + mode_info: ModeInfo, input_mode: InputMode, colors: Palette, ) -> Self { @@ -101,6 +103,7 @@ impl Screen { active_tab_index: None, tabs: BTreeMap::new(), os_api, + mode_info, input_mode, colors, } @@ -122,6 +125,7 @@ impl Screen { self.send_app_instructions.clone(), self.max_panes, Some(PaneId::Terminal(pane_id)), + self.mode_info.clone(), self.input_mode, self.colors, ); @@ -265,6 +269,7 @@ impl Screen { self.send_app_instructions.clone(), self.max_panes, None, + self.mode_info.clone(), self.input_mode, self.colors, ); @@ -306,10 +311,10 @@ impl Screen { } self.update_tabs(); } - pub fn change_input_mode(&mut self, input_mode: InputMode) { - self.input_mode = input_mode; + pub fn change_mode(&mut self, mode_info: ModeInfo) { + self.mode_info = mode_info; for tab in self.tabs.values_mut() { - tab.input_mode = self.input_mode; + tab.mode_info = self.mode_info.clone(); } } }