aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/config/ui_config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/config/ui_config.rs')
-rw-r--r--alacritty/src/config/ui_config.rs127
1 files changed, 123 insertions, 4 deletions
diff --git a/alacritty/src/config/ui_config.rs b/alacritty/src/config/ui_config.rs
index 15423da5..a76bbb78 100644
--- a/alacritty/src/config/ui_config.rs
+++ b/alacritty/src/config/ui_config.rs
@@ -1,8 +1,11 @@
use std::cell::RefCell;
+use std::collections::HashMap;
use std::fmt::{self, Formatter};
use std::path::PathBuf;
use std::rc::Rc;
+use alacritty_terminal::term::Config as TermConfig;
+use alacritty_terminal::tty::{Options as PtyOptions, Shell};
use log::{error, warn};
use serde::de::{Error as SerdeError, MapAccess, Visitor};
use serde::{self, Deserialize, Deserializer};
@@ -10,7 +13,6 @@ use unicode_width::UnicodeWidthChar;
use winit::keyboard::{Key, KeyLocation, ModifiersState};
use alacritty_config_derive::{ConfigDeserialize, SerdeReplace};
-use alacritty_terminal::config::{Config as TerminalConfig, Program, LOG_TARGET_CONFIG};
use alacritty_terminal::term::search::RegexSearch;
use crate::config::bell::BellConfig;
@@ -18,10 +20,15 @@ use crate::config::bindings::{
self, Action, Binding, BindingKey, KeyBinding, ModeWrapper, ModsWrapper, MouseBinding,
};
use crate::config::color::Colors;
+use crate::config::cursor::Cursor;
use crate::config::debug::Debug;
use crate::config::font::Font;
use crate::config::mouse::{Mouse, MouseBindings};
+use crate::config::scrolling::Scrolling;
+use crate::config::selection::Selection;
+use crate::config::terminal::Terminal;
use crate::config::window::WindowConfig;
+use crate::config::LOG_TARGET_CONFIG;
/// Regex used for the default URL hint.
#[rustfmt::skip]
@@ -30,6 +37,18 @@ const URL_REGEX: &str = "(ipfs:|ipns:|magnet:|mailto:|gemini://|gopher://|https:
#[derive(ConfigDeserialize, Clone, Debug, PartialEq)]
pub struct UiConfig {
+ /// Extra environment variables.
+ pub env: HashMap<String, String>,
+
+ /// How much scrolling history to keep.
+ pub scrolling: Scrolling,
+
+ /// Cursor configuration.
+ pub cursor: Cursor,
+
+ /// Selection configuration.
+ pub selection: Selection,
+
/// Font configuration.
pub font: Font,
@@ -68,8 +87,13 @@ pub struct UiConfig {
pub ipc_socket: bool,
/// Config for the alacritty_terminal itself.
- #[config(flatten)]
- pub terminal_config: TerminalConfig,
+ pub terminal: Terminal,
+
+ /// Path to a shell program to run on startup.
+ pub shell: Option<Program>,
+
+ /// Shell startup directory.
+ pub working_directory: Option<PathBuf>,
/// Keyboard configuration.
keyboard: Keyboard,
@@ -100,25 +124,48 @@ impl Default for UiConfig {
#[cfg(unix)]
ipc_socket: true,
draw_bold_text_with_bright_colors: Default::default(),
- terminal_config: Default::default(),
+ working_directory: Default::default(),
mouse_bindings: Default::default(),
config_paths: Default::default(),
key_bindings: Default::default(),
alt_send_esc: Default::default(),
+ scrolling: Default::default(),
+ selection: Default::default(),
keyboard: Default::default(),
+ terminal: Default::default(),
import: Default::default(),
+ cursor: Default::default(),
window: Default::default(),
colors: Default::default(),
+ shell: Default::default(),
mouse: Default::default(),
debug: Default::default(),
hints: Default::default(),
font: Default::default(),
bell: Default::default(),
+ env: Default::default(),
}
}
}
impl UiConfig {
+ /// Derive [`TermConfig`] from the config.
+ pub fn term_options(&self) -> TermConfig {
+ TermConfig {
+ scrolling_history: self.scrolling.history() as usize,
+ default_cursor_style: self.cursor.style(),
+ vi_mode_cursor_style: self.cursor.vi_mode_style(),
+ semantic_escape_chars: self.selection.semantic_escape_chars.clone(),
+ osc52: self.terminal.osc52.0,
+ }
+ }
+
+ /// Derive [`PtyOptions`] from the config.
+ pub fn pty_config(&self) -> PtyOptions {
+ let shell = self.shell.clone().map(Into::into);
+ PtyOptions { shell, working_directory: self.working_directory.clone(), hold: false }
+ }
+
/// Generate key bindings for all keyboard hints.
pub fn generate_hint_bindings(&mut self) {
// Check which key bindings is most likely to be the user's configuration.
@@ -551,6 +598,78 @@ impl PartialEq for LazyRegexVariant {
}
impl Eq for LazyRegexVariant {}
+/// Wrapper around f32 that represents a percentage value between 0.0 and 1.0.
+#[derive(SerdeReplace, Deserialize, Clone, Copy, Debug, PartialEq)]
+pub struct Percentage(f32);
+
+impl Default for Percentage {
+ fn default() -> Self {
+ Percentage(1.0)
+ }
+}
+
+impl Percentage {
+ pub fn new(value: f32) -> Self {
+ Percentage(value.clamp(0., 1.))
+ }
+
+ pub fn as_f32(self) -> f32 {
+ self.0
+ }
+}
+
+#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
+#[serde(untagged, deny_unknown_fields)]
+pub enum Program {
+ Just(String),
+ WithArgs {
+ program: String,
+ #[serde(default)]
+ args: Vec<String>,
+ },
+}
+
+impl Program {
+ pub fn program(&self) -> &str {
+ match self {
+ Program::Just(program) => program,
+ Program::WithArgs { program, .. } => program,
+ }
+ }
+
+ pub fn args(&self) -> &[String] {
+ match self {
+ Program::Just(_) => &[],
+ Program::WithArgs { args, .. } => args,
+ }
+ }
+}
+
+impl From<Program> for Shell {
+ fn from(value: Program) -> Self {
+ match value {
+ Program::Just(program) => Shell::new(program, Vec::new()),
+ Program::WithArgs { program, args } => Shell::new(program, args),
+ }
+ }
+}
+
+pub(crate) struct StringVisitor;
+impl<'de> serde::de::Visitor<'de> for StringVisitor {
+ type Value = String;
+
+ fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ formatter.write_str("a string")
+ }
+
+ fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
+ where
+ E: serde::de::Error,
+ {
+ Ok(s.to_lowercase())
+ }
+}
+
#[cfg(test)]
mod tests {
use super::*;