Default mode 368

* Parsing Implemented

* Adds option to specify a default mode
  either through a flag `--options default-mode [MODE]`,
  or a configuration option `default_mode: [MODE]`

closes #368
This commit is contained in:
a-kenji 2021-05-14 23:28:30 +02:00
parent f1bff237a4
commit 80fe803ffd
5 changed files with 42 additions and 4 deletions

View file

@ -20,6 +20,7 @@ use crate::common::{
thread_bus::{SenderType, SenderWithContext, SyncChannelWithContext}, thread_bus::{SenderType, SenderWithContext, SyncChannelWithContext},
}; };
use crate::server::ServerInstruction; use crate::server::ServerInstruction;
use zellij_tile::data::InputMode;
/// Instructions related to the client-side application and sent from server to client /// Instructions related to the client-side application and sent from server to client
#[derive(Serialize, Deserialize, Debug, Clone)] #[derive(Serialize, Deserialize, Debug, Clone)]
@ -54,7 +55,7 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, opts: CliArgs, config: C
os_input.send_to_server(ServerInstruction::NewClient( os_input.send_to_server(ServerInstruction::NewClient(
full_screen_ws, full_screen_ws,
opts, opts,
config_options, config_options.clone(),
)); ));
os_input.set_raw_mode(0); os_input.set_raw_mode(0);
let _ = os_input let _ = os_input
@ -83,12 +84,14 @@ pub fn start_client(mut os_input: Box<dyn ClientOsApi>, opts: CliArgs, config: C
let send_client_instructions = send_client_instructions.clone(); let send_client_instructions = send_client_instructions.clone();
let command_is_executing = command_is_executing.clone(); let command_is_executing = command_is_executing.clone();
let os_input = os_input.clone(); let os_input = os_input.clone();
let default_mode = config_options.default_mode.unwrap_or(InputMode::Normal);
move || { move || {
input_loop( input_loop(
os_input, os_input,
config, config,
command_is_executing, command_is_executing,
send_client_instructions, send_client_instructions,
default_mode,
) )
} }
}); });

View file

@ -33,9 +33,10 @@ impl InputHandler {
command_is_executing: CommandIsExecuting, command_is_executing: CommandIsExecuting,
config: Config, config: Config,
send_client_instructions: SenderWithContext<ClientInstruction>, send_client_instructions: SenderWithContext<ClientInstruction>,
mode: InputMode,
) -> Self { ) -> Self {
InputHandler { InputHandler {
mode: InputMode::Normal, mode,
os_input, os_input,
config, config,
command_is_executing, command_is_executing,
@ -225,12 +226,14 @@ pub fn input_loop(
config: Config, config: Config,
command_is_executing: CommandIsExecuting, command_is_executing: CommandIsExecuting,
send_client_instructions: SenderWithContext<ClientInstruction>, send_client_instructions: SenderWithContext<ClientInstruction>,
default_mode: InputMode,
) { ) {
let _handler = InputHandler::new( let _handler = InputHandler::new(
os_input, os_input,
command_is_executing, command_is_executing,
config, config,
send_client_instructions, send_client_instructions,
default_mode,
) )
.handle_input(); .handle_input();
} }

View file

@ -2,6 +2,7 @@
use crate::cli::ConfigCli; use crate::cli::ConfigCli;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use structopt::StructOpt; use structopt::StructOpt;
use zellij_tile::data::InputMode;
#[derive(Clone, Default, Debug, PartialEq, Deserialize, Serialize, StructOpt)] #[derive(Clone, Default, Debug, PartialEq, Deserialize, Serialize, StructOpt)]
/// Options that can be set either through the config file, /// Options that can be set either through the config file,
@ -11,6 +12,9 @@ pub struct Options {
/// that is compatible with more fonts /// that is compatible with more fonts
#[structopt(long)] #[structopt(long)]
pub simplified_ui: bool, pub simplified_ui: bool,
/// Allows to specify the default mode
#[structopt(long)]
pub default_mode: Option<InputMode>,
} }
impl Options { impl Options {
@ -32,7 +36,15 @@ impl Options {
self.simplified_ui 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<ConfigCli>) -> Options { pub fn from_cli(&self, other: Option<ConfigCli>) -> Options {

View file

@ -333,6 +333,7 @@ pub fn screen_thread_main(
) { ) {
let colors = bus.os_input.as_ref().unwrap().load_palette(); let colors = bus.os_input.as_ref().unwrap().load_palette();
let capabilities = config_options.simplified_ui; let capabilities = config_options.simplified_ui;
let default_mode = config_options.default_mode.unwrap_or_default();
let mut screen = Screen::new( let mut screen = Screen::new(
bus, bus,
@ -343,9 +344,10 @@ pub fn screen_thread_main(
capabilities: PluginCapabilities { capabilities: PluginCapabilities {
arrow_fonts: capabilities, arrow_fonts: capabilities,
}, },
mode: default_mode,
..ModeInfo::default() ..ModeInfo::default()
}, },
InputMode::Normal, default_mode,
colors, colors,
); );
loop { loop {

View file

@ -1,4 +1,5 @@
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::str::FromStr;
use strum_macros::{EnumDiscriminants, EnumIter, EnumString, ToString}; use strum_macros::{EnumDiscriminants, EnumIter, EnumString, ToString};
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
@ -89,6 +90,23 @@ impl Default for PaletteColor {
} }
} }
impl FromStr for InputMode {
type Err = Box<dyn std::error::Error>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
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)] #[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)]
pub enum PaletteSource { pub enum PaletteSource {
Default, Default,