From 138ba850ebf7df02526990f428207e0f8ec48ece Mon Sep 17 00:00:00 2001 From: Brooks J Rady Date: Wed, 31 Mar 2021 12:13:00 +0100 Subject: [PATCH] fix(plugin): send mode updates to subscribed plugins on load --- src/client/tab.rs | 25 +++++++++++++++++-------- src/common/errors.rs | 4 ++-- src/common/input/handler.rs | 2 +- src/common/mod.rs | 8 ++++---- src/common/screen.rs | 20 ++++++++++---------- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/client/tab.rs b/src/client/tab.rs index 1e56fd8b..6a0ec72f 100644 --- a/src/client/tab.rs +++ b/src/client/tab.rs @@ -15,7 +15,7 @@ use std::{ collections::{BTreeMap, HashSet}, }; use std::{io::Write, sync::mpsc::channel}; -use zellij_tile::data::{Event, InputMode}; +use zellij_tile::data::{Event, ModeInfo}; 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; @@ -66,7 +66,7 @@ pub struct Tab { pub send_plugin_instructions: SenderWithContext, pub send_app_instructions: SenderWithContext, expansion_boundary: Option, - pub input_mode: InputMode, + pub mode_info: ModeInfo, } // FIXME: Use a struct that has a pane_type enum, to reduce all of the duplication @@ -183,7 +183,7 @@ impl Tab { send_app_instructions: SenderWithContext, max_panes: Option, pane_id: Option, - input_mode: InputMode, + mode_info: ModeInfo, ) -> Self { let panes = if let Some(PaneId::Terminal(pid)) = pane_id { let new_terminal = TerminalPane::new(pid, *full_screen_ws); @@ -213,7 +213,7 @@ impl Tab { send_pty_instructions, send_plugin_instructions, expansion_boundary: None, - input_mode, + mode_info, } } @@ -267,6 +267,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 @@ -626,10 +633,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(colors::GREEN)) - } - false => boundaries.add_rect(terminal.as_ref(), self.input_mode, None), + true => boundaries.add_rect( + terminal.as_ref(), + self.mode_info.mode, + Some(colors::GREEN), + ), + 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 33f4e5dc..7f73b449 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 e895fcc0..a566d655 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -37,7 +37,7 @@ use wasm_vm::PluginEnv; use wasm_vm::{wasi_stdout, wasi_write_string, zellij_imports, PluginInstruction}; use wasmer::{ChainableNamedResolver, Instance, Module, Store, Value}; use wasmer_wasi::{Pipe, WasiState}; -use zellij_tile::data::{EventType, InputMode}; +use zellij_tile::data::{EventType, ModeInfo}; #[derive(Serialize, Deserialize, Debug)] pub enum ApiCommand { @@ -256,7 +256,7 @@ pub fn start(mut os_input: Box, opts: CliArgs) { &full_screen_ws, os_input, max_panes, - InputMode::Normal, + ModeInfo::default(), ); loop { let (event, mut err_ctx) = screen @@ -389,8 +389,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 5208834a..178e8be9 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, TabInfo}; +use zellij_tile::data::{Event, ModeInfo, 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,7 +74,7 @@ pub struct Screen { active_tab_index: Option, /// The [`OsApi`] this [`Screen`] uses. os_api: Box, - input_mode: InputMode, + mode_info: ModeInfo, } impl Screen { @@ -87,7 +87,7 @@ impl Screen { full_screen_ws: &PositionAndSize, os_api: Box, max_panes: Option, - input_mode: InputMode, + mode_info: ModeInfo, ) -> Self { Screen { receiver: receive_screen_instructions, @@ -99,7 +99,7 @@ impl Screen { active_tab_index: None, tabs: BTreeMap::new(), os_api, - input_mode, + mode_info, } } @@ -119,7 +119,7 @@ impl Screen { self.send_app_instructions.clone(), self.max_panes, Some(PaneId::Terminal(pane_id)), - self.input_mode, + self.mode_info.clone(), ); self.active_tab_index = Some(tab_index); self.tabs.insert(tab_index, tab); @@ -261,7 +261,7 @@ impl Screen { self.send_app_instructions.clone(), self.max_panes, None, - self.input_mode, + self.mode_info.clone(), ); tab.apply_layout(layout, new_pids); self.active_tab_index = Some(tab_index); @@ -301,10 +301,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(); } } }