diff options
author | Josh Rahm <rahm@google.com> | 2021-10-25 22:49:16 -0600 |
---|---|---|
committer | Josh Rahm <rahm@google.com> | 2021-10-25 22:49:16 -0600 |
commit | b28edbad4eea1c4c8b233925ec520ec8f401d407 (patch) | |
tree | be33004cff5a196a03ee469de0b650f685fc81f7 | |
parent | 01554367f00f7c39ad17163cd5922a069284844a (diff) | |
download | r-alacritty-experimental.tar.gz r-alacritty-experimental.tar.bz2 r-alacritty-experimental.zip |
add logo key prefix and alt behavior configuration optionsexperimental
-rw-r--r-- | alacritty/src/config/bindings.rs | 2 | ||||
-rw-r--r-- | alacritty/src/config/mod.rs | 1 | ||||
-rw-r--r-- | alacritty/src/config/ui_config.rs | 14 | ||||
-rw-r--r-- | alacritty/src/input.rs | 30 |
4 files changed, 39 insertions, 8 deletions
diff --git a/alacritty/src/config/bindings.rs b/alacritty/src/config/bindings.rs index dc648541..91fcd7a0 100644 --- a/alacritty/src/config/bindings.rs +++ b/alacritty/src/config/bindings.rs @@ -383,6 +383,8 @@ pub fn default_key_bindings() -> Vec<KeyBinding> { Action::Esc("\x0c".into()); Tab, ModifiersState::SHIFT, ~BindingMode::VI, ~BindingMode::SEARCH; Action::Esc("\x1b[Z".into()); + Tab, ModifiersState::SHIFT|ModifiersState::LOGO, ~BindingMode::VI, ~BindingMode::SEARCH; + Action::Esc("\x1b[Z".into()); Back, ModifiersState::ALT, ~BindingMode::VI, ~BindingMode::SEARCH; Action::Esc("\x1b\x7f".into()); Back, ModifiersState::SHIFT, ~BindingMode::VI, ~BindingMode::SEARCH; diff --git a/alacritty/src/config/mod.rs b/alacritty/src/config/mod.rs index 4a3c0ae9..8e834278 100644 --- a/alacritty/src/config/mod.rs +++ b/alacritty/src/config/mod.rs @@ -27,6 +27,7 @@ pub use crate::config::bindings::{ }; #[cfg(test)] pub use crate::config::mouse::{ClickHandler, Mouse}; +pub use crate::config::ui_config::AltBehavior; use crate::config::ui_config::UiConfig; /// Maximum number of depth for the configuration file imports. diff --git a/alacritty/src/config/ui_config.rs b/alacritty/src/config/ui_config.rs index f05b243c..72d62c87 100644 --- a/alacritty/src/config/ui_config.rs +++ b/alacritty/src/config/ui_config.rs @@ -27,6 +27,13 @@ use crate::config::window::WindowConfig; const URL_REGEX: &str = "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ [^\u{0000}-\u{001F}\u{007F}-\u{009F}<>\"\\s{-}\\^⟨⟩`]+"; +#[derive(Deserialize, Debug, PartialEq)] +pub enum AltBehavior { + NONE, + SEND_ESC, + TERMKEY, +} + #[derive(ConfigDeserialize, Debug, PartialEq)] pub struct UiConfig { /// Font configuration. @@ -41,7 +48,7 @@ pub struct UiConfig { pub debug: Debug, /// Send escape sequences using the alt key. - pub alt_send_esc: bool, + pub alt_behavior: AltBehavior, /// Live config reload. pub live_config_reload: bool, @@ -62,6 +69,8 @@ pub struct UiConfig { /// Regex hints for interacting with terminal content. pub hints: Hints, + pub logo_key_prefix: String, + /// Keybindings. key_bindings: KeyBindings, @@ -76,7 +85,7 @@ pub struct UiConfig { impl Default for UiConfig { fn default() -> Self { Self { - alt_send_esc: true, + alt_behavior: AltBehavior::SEND_ESC, live_config_reload: true, font: Default::default(), window: Default::default(), @@ -88,6 +97,7 @@ impl Default for UiConfig { background_opacity: Default::default(), bell: Default::default(), colors: Default::default(), + logo_key_prefix: "\x1b[24;8~".into(), draw_bold_text_with_bright_colors: Default::default(), hints: Default::default(), } diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs index 7851b6e4..a5f9590b 100644 --- a/alacritty/src/input.rs +++ b/alacritty/src/input.rs @@ -9,6 +9,7 @@ use std::borrow::Cow; use std::cmp::{max, min, Ordering}; use std::marker::PhantomData; use std::time::{Duration, Instant}; +use log::{trace}; use glutin::dpi::PhysicalPosition; use glutin::event::{ @@ -29,7 +30,7 @@ use alacritty_terminal::term::{ClipboardType, SizeInfo, Term, TermMode}; use alacritty_terminal::vi_mode::ViMotion; use crate::clipboard::Clipboard; -use crate::config::{Action, BindingMode, Config, Key, MouseAction, SearchAction, ViAction}; +use crate::config::{Action, BindingMode, Config, Key, MouseAction, SearchAction, ViAction, AltBehavior}; use crate::daemon::start_daemon; use crate::display::hint::HintMatch; use crate::display::window::Window; @@ -723,6 +724,7 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { /// Process key input. pub fn key_input(&mut self, input: KeyboardInput) { + trace!("Input {:?}\n", input); // All key bindings are disabled while a hint is being selected. if self.ctx.display().hint_state.active() { *self.ctx.suppress_chars() = false; @@ -792,10 +794,13 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { let utf8_len = c.len_utf8(); let mut all_bytes = Vec::new(); - let shift = self.ctx.modifiers().shift(); + let mut shift = self.ctx.modifiers().shift(); let alt = self.ctx.modifiers().alt(); let ctrl = self.ctx.modifiers().ctrl(); let logo = self.ctx.modifiers().logo(); + let termkey = alt && self.ctx.config().ui_config.alt_behavior == AltBehavior::TERMKEY; + + trace!("Got Char {}", c as u32); fn encode_extended_ctrl_char(c: char) -> bool { return ! c.is_ascii_control() @@ -804,11 +809,24 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { || c == '\x07'; } - if ((shift || alt || encode_extended_ctrl_char(c)) && ctrl) || logo { + if logo { + let prefix = &self.ctx.config().ui_config.logo_key_prefix; + all_bytes.append(&mut prefix.as_bytes().to_vec()); + } + + if ((shift || alt) && (ctrl || c.is_ascii_control())) || termkey { + + let newshift = if c > 0x20.into() && c != 0x7f.into() { + // Really shift is only good for characters that don't have an + // associated shifted form. + false + } else { + shift + }; + // Special, extended character code let modifier_code = - 1 + (shift as u32) + (alt as u32) * 2 + (ctrl as u32) * 4 + (logo as u32) * 8; - + 1 + (newshift as u32) + (alt as u32) * 2 + (ctrl as u32) * 4; let out = format!("\x1b[{};{}u", c as u32, modifier_code); all_bytes.append(&mut out.into_bytes()); } else { @@ -819,7 +837,7 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { c.encode_utf8(&mut char_bytes[..]); } - if self.ctx.config().ui_config.alt_send_esc + if self.ctx.config().ui_config.alt_behavior == AltBehavior::SEND_ESC && *self.ctx.received_count() == 0 && alt { |