summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Chibisov <contact@kchibisov.com>2023-11-10 18:16:22 +0400
committerGitHub <noreply@github.com>2023-11-10 18:16:22 +0400
commit5060f8eeb864e8c304fbad9588bdd882db942356 (patch)
treeb615ded19e6ac545b495f716e2a22ecd903332af
parent3ffd6c8f26f9788466b9ba95659b8de970a10f08 (diff)
Remove `alacritty_config` from alacritty_terminal
There's no need to force alacritty's user configuration on other users of the crate, thus provide the options actually used by alacritty_terminal itself.
-rw-r--r--Cargo.lock42
-rw-r--r--alacritty/Cargo.toml1
-rw-r--r--alacritty/src/cli.rs15
-rw-r--r--alacritty/src/config/bell.rs4
-rw-r--r--alacritty/src/config/bindings.rs23
-rw-r--r--alacritty/src/config/color.rs3
-rw-r--r--alacritty/src/config/cursor.rs156
-rw-r--r--alacritty/src/config/mod.rs7
-rw-r--r--alacritty/src/config/scrolling.rs (renamed from alacritty_terminal/src/config/scrolling.rs)5
-rw-r--r--alacritty/src/config/selection.rs17
-rw-r--r--alacritty/src/config/terminal.rs26
-rw-r--r--alacritty/src/config/ui_config.rs127
-rw-r--r--alacritty/src/config/window.rs9
-rw-r--r--alacritty/src/display/color.rs199
-rw-r--r--alacritty/src/display/content.rs13
-rw-r--r--alacritty/src/display/cursor.rs4
-rw-r--r--alacritty/src/display/hint.rs2
-rw-r--r--alacritty/src/display/mod.rs21
-rw-r--r--alacritty/src/event.rs25
-rw-r--r--alacritty/src/input.rs6
-rw-r--r--alacritty/src/logging.rs5
-rw-r--r--alacritty/src/main.rs13
-rw-r--r--alacritty/src/renderer/mod.rs2
-rw-r--r--alacritty/src/renderer/rects.rs2
-rw-r--r--alacritty/src/window_context.rs14
-rw-r--r--alacritty_terminal/Cargo.toml16
-rw-r--r--alacritty_terminal/src/ansi.rs60
-rw-r--r--alacritty_terminal/src/config/mod.rs263
-rw-r--r--alacritty_terminal/src/event.rs2
-rw-r--r--alacritty_terminal/src/event_loop.rs3
-rw-r--r--alacritty_terminal/src/grid/mod.rs10
-rw-r--r--alacritty_terminal/src/grid/row.rs4
-rw-r--r--alacritty_terminal/src/grid/storage.rs4
-rw-r--r--alacritty_terminal/src/index.rs24
-rw-r--r--alacritty_terminal/src/lib.rs3
-rw-r--r--alacritty_terminal/src/selection.rs7
-rw-r--r--alacritty_terminal/src/term/cell.rs19
-rw-r--r--alacritty_terminal/src/term/color.rs202
-rw-r--r--alacritty_terminal/src/term/mod.rs177
-rw-r--r--alacritty_terminal/src/term/search.rs8
-rw-r--r--alacritty_terminal/src/tty/mod.rs41
-rw-r--r--alacritty_terminal/src/tty/unix.rs9
-rw-r--r--alacritty_terminal/src/tty/windows/conpty.rs4
-rw-r--r--alacritty_terminal/src/tty/windows/mod.rs13
-rw-r--r--alacritty_terminal/src/vi_mode.rs13
-rw-r--r--alacritty_terminal/tests/ref.rs11
46 files changed, 840 insertions, 794 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 1a87f9a0..53e2597a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -38,7 +38,7 @@ dependencies = [
"alacritty_config",
"alacritty_config_derive",
"alacritty_terminal",
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"clap",
"clap_complete",
"cocoa 0.25.0",
@@ -93,10 +93,8 @@ dependencies = [
name = "alacritty_terminal"
version = "0.20.0-dev"
dependencies = [
- "alacritty_config",
- "alacritty_config_derive",
"base64",
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"home",
"libc",
"log",
@@ -108,9 +106,7 @@ dependencies = [
"rustix-openpty",
"serde",
"serde_json",
- "serde_yaml",
"signal-hook",
- "toml 0.8.2",
"unicode-width",
"vte",
"windows-sys 0.48.0",
@@ -123,7 +119,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "052ad56e336bcc615a214bffbeca6c181ee9550acec193f0327e0b103b033a4d"
dependencies = [
"android-properties",
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"cc",
"cesu8",
"jni",
@@ -235,9 +231,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
-version = "2.4.0"
+version = "2.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
dependencies = [
"serde",
]
@@ -291,7 +287,7 @@ version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"log",
"polling",
"rustix",
@@ -886,7 +882,7 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eca18d477e18c996c1fd1a50e04c6a745b67e2d512c7fb51f2757d9486a0e3ee"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"cfg_aliases",
"cgl",
"core-foundation",
@@ -1206,7 +1202,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"jni-sys",
"log",
"ndk-sys",
@@ -1259,7 +1255,7 @@ version = "6.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"crossbeam-channel",
"filetime",
"fsevent-sys",
@@ -1554,7 +1550,7 @@ version = "0.38.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67ce50cb2e16c2903e30d1cbccfd8387a74b9d4c938b6a4c5ec6cc7556f7a8a0"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"errno",
"itoa",
"libc",
@@ -1738,7 +1734,7 @@ version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60e3d9941fa3bacf7c2bf4b065304faa14164151254cd16ce1b1bc8fc381600f"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"calloop",
"calloop-wayland-source",
"cursor-icon",
@@ -1983,7 +1979,7 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "401dc1020e10f74d38616c1f1ab92ccd85dc902705a29d0730e0fbea8534f91a"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"cursor-icon",
"log",
"serde",
@@ -2103,7 +2099,7 @@ version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"nix",
"wayland-backend",
"wayland-scanner",
@@ -2115,7 +2111,7 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"cursor-icon",
"wayland-backend",
]
@@ -2137,7 +2133,7 @@ version = "0.31.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"wayland-backend",
"wayland-client",
"wayland-scanner",
@@ -2149,7 +2145,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"wayland-backend",
"wayland-client",
"wayland-protocols",
@@ -2162,7 +2158,7 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"wayland-backend",
"wayland-client",
"wayland-protocols",
@@ -2394,7 +2390,7 @@ dependencies = [
"ahash",
"android-activity",
"atomic-waker",
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"bytemuck",
"calloop",
"cfg_aliases",
@@ -2529,7 +2525,7 @@ version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6924668544c48c0133152e7eec86d644a056ca3d09275eb8d5cdb9855f9d8699"
dependencies = [
- "bitflags 2.4.0",
+ "bitflags 2.4.1",
"dlib",
"log",
"once_cell",
diff --git a/alacritty/Cargo.toml b/alacritty/Cargo.toml
index 1d66b79a..d313f4a8 100644
--- a/alacritty/Cargo.toml
+++ b/alacritty/Cargo.toml
@@ -12,7 +12,6 @@ rust-version = "1.70.0"
[dependencies.alacritty_terminal]
path = "../alacritty_terminal"
version = "0.20.0-dev"
-default-features = false
[dependencies.alacritty_config_derive]
path = "../alacritty_config_derive"
diff --git a/alacritty/src/cli.rs b/alacritty/src/cli.rs
index c9890b9b..4745ee8d 100644
--- a/alacritty/src/cli.rs
+++ b/alacritty/src/cli.rs
@@ -6,8 +6,9 @@ use log::{self, error, LevelFilter};
use serde::{Deserialize, Serialize};
use toml::{Table, Value};
-use alacritty_terminal::config::{Program, PtyConfig};
+use alacritty_terminal::tty::Options as PtyOptions;
+use crate::config::ui_config::Program;
use crate::config::window::{Class, Identity};
use crate::config::{serde_utils, UiConfig};
@@ -178,8 +179,8 @@ impl TerminalOptions {
Some(Program::WithArgs { program: program.clone(), args: args.to_vec() })
}
- /// Override the [`PtyConfig`]'s fields with the [`TerminalOptions`].
- pub fn override_pty_config(&self, pty_config: &mut PtyConfig) {
+ /// Override the [`PtyOptions`]'s fields with the [`TerminalOptions`].
+ pub fn override_pty_config(&self, pty_config: &mut PtyOptions) {
if let Some(working_directory) = &self.working_directory {
if working_directory.is_dir() {
pty_config.working_directory = Some(working_directory.to_owned());
@@ -189,18 +190,18 @@ impl TerminalOptions {
}
if let Some(command) = self.command() {
- pty_config.shell = Some(command);
+ pty_config.shell = Some(command.into());
}
pty_config.hold |= self.hold;
}
}
-impl From<TerminalOptions> for PtyConfig {
+impl From<TerminalOptions> for PtyOptions {
fn from(mut options: TerminalOptions) -> Self {
- PtyConfig {
+ PtyOptions {
working_directory: options.working_directory.take(),
- shell: options.command(),
+ shell: options.command().map(Into::into),
hold: options.hold,
}
}
diff --git a/alacritty/src/config/bell.rs b/alacritty/src/config/bell.rs
index fbf5be2f..1510f4b5 100644
--- a/alacritty/src/config/bell.rs
+++ b/alacritty/src/config/bell.rs
@@ -2,8 +2,8 @@ use std::time::Duration;
use alacritty_config_derive::ConfigDeserialize;
-use alacritty_terminal::config::Program;
-use alacritty_terminal::term::color::Rgb;
+use crate::config::ui_config::Program;
+use crate::display::color::Rgb;
#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq)]
pub struct BellConfig {
diff --git a/alacritty/src/config/bindings.rs b/alacritty/src/config/bindings.rs
index c56445f3..01e7e59c 100644
--- a/alacritty/src/config/bindings.rs
+++ b/alacritty/src/config/bindings.rs
@@ -14,11 +14,10 @@ use winit::platform::scancode::PhysicalKeyExtScancode;
use alacritty_config_derive::{ConfigDeserialize, SerdeReplace};
-use alacritty_terminal::config::Program;
use alacritty_terminal::term::TermMode;
use alacritty_terminal::vi_mode::ViMotion;
-use crate::config::ui_config::Hint;
+use crate::config::ui_config::{Hint, Program, StringVisitor};
/// Describes a state and action to take in that state.
///
@@ -1103,8 +1102,9 @@ impl<'a> Deserialize<'a> for RawBinding {
action = if let Ok(vi_action) = ViAction::deserialize(value.clone()) {
Some(vi_action.into())
- } else if let Ok(vi_motion) = ViMotion::deserialize(value.clone()) {
- Some(vi_motion.into())
+ } else if let Ok(vi_motion) = SerdeViMotion::deserialize(value.clone())
+ {
+ Some(vi_motion.0.into())
} else if let Ok(search_action) =
SearchAction::deserialize(value.clone())
{
@@ -1213,6 +1213,21 @@ impl<'a> Deserialize<'a> for KeyBinding {
}
}
+#[derive(SerdeReplace, Debug, Copy, Clone, Eq, PartialEq)]
+pub struct SerdeViMotion(ViMotion);
+
+impl<'de> Deserialize<'de> for SerdeViMotion {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ let value = deserializer.deserialize_str(StringVisitor)?;
+ ViMotion::deserialize(SerdeValue::String(value))
+ .map(SerdeViMotion)
+ .map_err(de::Error::custom)
+ }
+}
+
/// Newtype for implementing deserialize on winit Mods.
///
/// Our deserialize impl wouldn't be covered by a derive(Deserialize); see the
diff --git a/alacritty/src/config/color.rs b/alacritty/src/config/color.rs
index b6334460..995d0499 100644
--- a/alacritty/src/config/color.rs
+++ b/alacritty/src/config/color.rs
@@ -2,7 +2,8 @@ use serde::de::Error as SerdeError;
use serde::{Deserialize, Deserializer};
use alacritty_config_derive::ConfigDeserialize;
-use alacritty_terminal::term::color::{CellRgb, Rgb};
+
+use crate::display::color::{CellRgb, Rgb};
#[derive(ConfigDeserialize, Clone, Debug, Default, PartialEq, Eq)]
pub struct Colors {
diff --git a/alacritty/src/config/cursor.rs b/alacritty/src/config/cursor.rs
new file mode 100644
index 00000000..dc205b4b
--- /dev/null
+++ b/alacritty/src/config/cursor.rs
@@ -0,0 +1,156 @@
+use std::cmp;
+use std::time::Duration;
+
+use serde::Deserialize;
+
+use alacritty_config_derive::{ConfigDeserialize, SerdeReplace};
+use alacritty_terminal::vte::ansi::{CursorShape as VteCursorShape, CursorStyle as VteCursorStyle};
+
+use crate::config::ui_config::Percentage;
+
+/// The minimum blink interval value in milliseconds.
+const MIN_BLINK_INTERVAL: u64 = 10;
+
+/// The minimum number of blinks before pausing.
+const MIN_BLINK_CYCLES_BEFORE_PAUSE: u64 = 1;
+
+#[derive(ConfigDeserialize, Copy, Clone, Debug, PartialEq)]
+pub struct Cursor {
+ pub style: ConfigCursorStyle,
+ pub vi_mode_style: Option<ConfigCursorStyle>,
+ pub unfocused_hollow: bool,
+
+ thickness: Percentage,
+ blink_interval: u64,
+ blink_timeout: u8,
+}
+
+impl Default for Cursor {
+ fn default() -> Self {
+ Self {
+ thickness: Percentage::new(0.15),
+ unfocused_hollow: true,
+ blink_interval: 750,
+ blink_timeout: 5,
+ style: Default::default(),
+ vi_mode_style: Default::default(),
+ }
+ }
+}
+
+impl Cursor {
+ #[inline]
+ pub fn thickness(self) -> f32 {
+ self.thickness.as_f32()
+ }
+
+ #[inline]
+ pub fn style(self) -> VteCursorStyle {
+ self.style.into()
+ }
+
+ #[inline]
+ pub fn vi_mode_style(self) -> Option<VteCursorStyle> {
+ self.vi_mode_style.map(Into::into)
+ }
+
+ #[inline]
+ pub fn blink_interval(self) -> u64 {
+ cmp::max(self.blink_interval, MIN_BLINK_INTERVAL)
+ }
+
+ #[inline]
+ pub fn blink_timeout(self) -> Duration {
+ if self.blink_timeout == 0 {
+ Duration::ZERO
+ } else {
+ cmp::max(
+ // Show/hide is what we consider a cycle, so multiply by `2`.
+ Duration::from_millis(self.blink_interval * 2 * MIN_BLINK_CYCLES_BEFORE_PAUSE),
+ Duration::from_secs(self.blink_timeout as u64),
+ )
+ }
+ }
+}
+
+#[derive(SerdeReplace, Deserialize, Debug, Copy, Clone, PartialEq, Eq)]
+#[serde(untagged, deny_unknown_fields)]
+pub enum ConfigCursorStyle {
+ Shape(CursorShape),
+ WithBlinking {
+ #[serde(default)]
+ shape: CursorShape,
+ #[serde(default)]
+ blinking: CursorBlinking,
+ },
+}
+
+impl Default for ConfigCursorStyle {
+ fn default() -> Self {
+ Self::Shape(CursorShape::default())
+ }
+}
+
+impl ConfigCursorStyle {
+ /// Check if blinking is force enabled/disabled.
+ pub fn blinking_override(&self) -> Option<bool> {
+ match self {
+ Self::Shape(_) => None,
+ Self::WithBlinking { blinking, .. } => blinking.blinking_override(),
+ }
+ }
+}
+
+impl From<ConfigCursorStyle> for VteCursorStyle {
+ fn from(config_style: ConfigCursorStyle) -> Self {
+ match config_style {
+ ConfigCursorStyle::Shape(shape) => Self { shape: shape.into(), blinking: false },
+ ConfigCursorStyle::WithBlinking { shape, blinking } => {
+ Self { shape: shape.into(), blinking: blinking.into() }
+ },
+ }
+ }
+}
+
+#[derive(ConfigDeserialize, Default, Debug, Copy, Clone, PartialEq, Eq)]
+pub enum CursorBlinking {
+ Never,
+ #[default]
+ Off,
+ On,
+ Always,
+}
+
+impl CursorBlinking {
+ fn blinking_override(&self) -> Option<bool> {
+ match self {
+ Self::Never => Some(false),
+ Self::Off | Self::On => None,
+ Self::Always => Some(true),
+ }
+ }
+}
+
+impl From<CursorBlinking> for bool {
+ fn from(blinking: CursorBlinking) -> bool {
+ blinking == CursorBlinking::On || blinking == CursorBlinking::Always
+ }
+}
+
+#[derive(ConfigDeserialize, Debug, Default, Eq, PartialEq, Copy, Clone, Hash)]
+pub enum CursorShape {
+ #[default]
+ Block,
+ Underline,
+ Beam,
+}
+
+impl From<CursorShape> for VteCursorShape {
+ fn from(value: CursorShape) -> Self {
+ match value {
+ CursorShape::Block => VteCursorShape::Block,
+ CursorShape::Underline => VteCursorShape::Underline,
+ CursorShape::Beam => VteCursorShape::Beam,
+ }
+ }
+}
diff --git a/alacritty/src/config/mod.rs b/alacritty/src/config/mod.rs
index 762e1f39..678e08d5 100644
--- a/alacritty/src/config/mod.rs
+++ b/alacritty/src/config/mod.rs
@@ -10,14 +10,16 @@ use toml::de::Error as TomlError;
use toml::ser::Error as TomlSeError;
use toml::{Table, Value};
-use alacritty_terminal::config::LOG_TARGET_CONFIG;
-
pub mod bell;
pub mod color;
+pub mod cursor;
pub mod debug;
pub mod font;
pub mod monitor;
+pub mod scrolling;
+pub mod selection;
pub mod serde_utils;
+pub mod terminal;
pub mod ui_config;
pub mod window;
@@ -31,6 +33,7 @@ pub use crate::config::bindings::{
Action, BindingKey, BindingMode, MouseAction, SearchAction, ViAction,
};
pub use crate::config::ui_config::UiConfig;
+use crate::logging::LOG_TARGET_CONFIG;
/// Maximum number of depth for the configuration file imports.
pub const IMPORT_RECURSION_LIMIT: usize = 5;
diff --git a/alacritty_terminal/src/config/scrolling.rs b/alacritty/src/config/scrolling.rs
index 7ff306a9..3b2b21f3 100644
--- a/alacritty_terminal/src/config/scrolling.rs
+++ b/alacritty/src/config/scrolling.rs
@@ -24,11 +24,6 @@ impl Scrolling {
pub fn history(self) -> u32 {
self.history.0
}
-
- // Update the history size, used in ref tests.
- pub fn set_history(&mut self, history: u32) {
- self.history = ScrollingHistory(history);
- }
}
#[derive(SerdeReplace, Copy, Clone, Debug, PartialEq, Eq)]
diff --git a/alacritty/src/config/selection.rs b/alacritty/src/config/selection.rs
new file mode 100644
index 00000000..bf90b48f
--- /dev/null
+++ b/alacritty/src/config/selection.rs
@@ -0,0 +1,17 @@
+use alacritty_config_derive::ConfigDeserialize;
+use alacritty_terminal::term::SEMANTIC_ESCAPE_CHARS;
+
+#[derive(ConfigDeserialize, Clone, Debug, PartialEq, Eq)]
+pub struct Selection {
+ pub semantic_escape_chars: String,
+ pub save_to_clipboard: bool,
+}
+
+impl Default for Selection {
+ fn default() -> Self {
+ Self {
+ semantic_escape_chars: SEMANTIC_ESCAPE_CHARS.to_owned(),
+ save_to_clipboard: Default::default(),
+ }
+ }
+}
diff --git a/alacritty/src/config/terminal.rs b/alacritty/src/config/terminal.rs
new file mode 100644
index 00000000..b41af5db
--- /dev/null
+++ b/alacritty/src/config/terminal.rs
@@ -0,0 +1,26 @@
+use serde::{de, Deserialize, Deserializer};
+use toml::Value;
+
+use alacritty_config_derive::{ConfigDeserialize, SerdeReplace};
+use alacritty_terminal::term::Osc52;
+
+use crate::config::ui_config::StringVisitor;
+
+#[derive(ConfigDeserialize, Default, Copy, Clone, Debug, PartialEq)]
+pub struct Terminal {
+ /// OSC52 support mode.
+ pub osc52: SerdeOsc52,
+}
+
+#[derive(SerdeReplace, Default, Copy, Clone, Debug, PartialEq)]
+pub struct SerdeOsc52(pub Osc52);
+
+impl<'de> Deserialize<'de> for SerdeOsc52 {
+ fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ let value = deserializer.deserialize_str(StringVisitor)?;
+ Osc52::deserialize(Value::String(value)).map(SerdeOsc52).map_err(de::Error::custom)
+ }
+}
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::defa