diff --git a/zellij-client/src/input_handler.rs b/zellij-client/src/input_handler.rs index 70f6e98248..65181e5121 100644 --- a/zellij-client/src/input_handler.rs +++ b/zellij-client/src/input_handler.rs @@ -33,9 +33,10 @@ impl InputHandler { command_is_executing: CommandIsExecuting, config: Config, send_client_instructions: SenderWithContext, + mode: InputMode, ) -> Self { InputHandler { - mode: InputMode::Normal, + mode, os_input, config, command_is_executing, @@ -181,12 +182,14 @@ pub(crate) fn input_loop( config: Config, command_is_executing: CommandIsExecuting, send_client_instructions: SenderWithContext, + default_mode: InputMode, ) { let _handler = InputHandler::new( os_input, command_is_executing, config, send_client_instructions, + default_mode, ) .handle_input(); } diff --git a/zellij-client/src/lib.rs b/zellij-client/src/lib.rs index 3817e7908c..701047842d 100644 --- a/zellij-client/src/lib.rs +++ b/zellij-client/src/lib.rs @@ -127,14 +127,18 @@ pub fn start_client( ClientToServerMsg::NewClient( client_attributes, Box::new(opts), - Box::new(config_options), + Box::new(config_options.clone()), ) } }; #[cfg(any(feature = "test", test))] let first_msg = { let _ = SESSION_NAME.set("".into()); - ClientToServerMsg::NewClient(client_attributes, Box::new(opts), Box::new(config_options)) + ClientToServerMsg::NewClient( + client_attributes, + Box::new(opts), + Box::new(config_options.clone()), + ) }; os_input.connect_to_server(&*ZELLIJ_IPC_PIPE); @@ -168,12 +172,14 @@ pub fn start_client( let send_client_instructions = send_client_instructions.clone(); let command_is_executing = command_is_executing.clone(); let os_input = os_input.clone(); + let default_mode = config_options.default_mode.unwrap_or_default(); move || { input_loop( os_input, config, command_is_executing, send_client_instructions, + default_mode, ) } }); diff --git a/zellij-server/src/screen.rs b/zellij-server/src/screen.rs index 068037eea7..48be44bfcb 100644 --- a/zellij-server/src/screen.rs +++ b/zellij-server/src/screen.rs @@ -405,6 +405,7 @@ pub(crate) fn screen_thread_main( session_state: Arc>, ) { let capabilities = config_options.simplified_ui; + let default_mode = config_options.default_mode.unwrap_or_default(); let mut screen = Screen::new( bus, @@ -415,9 +416,10 @@ pub(crate) fn screen_thread_main( capabilities: PluginCapabilities { arrow_fonts: capabilities, }, + mode: default_mode, ..ModeInfo::default() }, - InputMode::Normal, + default_mode, session_state, ); loop { diff --git a/zellij-tile/src/data.rs b/zellij-tile/src/data.rs index cb4b2aa01c..3bd926ca63 100644 --- a/zellij-tile/src/data.rs +++ b/zellij-tile/src/data.rs @@ -1,4 +1,5 @@ use serde::{Deserialize, Serialize}; +use std::str::FromStr; use strum_macros::{EnumDiscriminants, EnumIter, EnumString, ToString}; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] @@ -92,6 +93,23 @@ impl Default for PaletteColor { } } +impl FromStr for InputMode { + type Err = Box; + + fn from_str(s: &str) -> Result { + match s { + "normal" => Ok(InputMode::Normal), + "resize" => Ok(InputMode::Resize), + "locked" => Ok(InputMode::Locked), + "pane" => Ok(InputMode::Pane), + "tab" => Ok(InputMode::Tab), + "scroll" => Ok(InputMode::Scroll), + "renametab" => Ok(InputMode::RenameTab), + e => Err(e.to_string().into()), + } + } +} + #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] pub enum PaletteSource { Default, diff --git a/zellij-utils/src/input/options.rs b/zellij-utils/src/input/options.rs index f9724c20f2..3476c2fb9c 100644 --- a/zellij-utils/src/input/options.rs +++ b/zellij-utils/src/input/options.rs @@ -2,6 +2,7 @@ use crate::cli::Command; use serde::{Deserialize, Serialize}; use structopt::StructOpt; +use zellij_tile::data::InputMode; #[derive(Clone, Default, Debug, PartialEq, Deserialize, Serialize, StructOpt)] /// Options that can be set either through the config file, @@ -11,6 +12,9 @@ pub struct Options { /// that is compatible with more fonts #[structopt(long)] pub simplified_ui: bool, + /// Allows to specify the default mode + #[structopt(long)] + pub default_mode: Option, } impl Options { @@ -32,7 +36,15 @@ impl Options { self.simplified_ui }; - Options { simplified_ui } + let default_mode = match other.default_mode { + None => self.default_mode, + other => other, + }; + + Options { + simplified_ui, + default_mode, + } } pub fn from_cli(&self, other: Option) -> Options {