diff options
author | Kirill Chibisov <contact@kchibisov.com> | 2020-07-11 20:03:09 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-11 20:03:09 +0300 |
commit | 18cf806a27f06185b1ceb2d63f3b9bc2dd3dc80e (patch) | |
tree | 6609ca3aec4fe8da171de474a4a8e8d9b572f0e5 /alacritty_terminal | |
parent | 5f039cee49b9c817177c6feecc5e7d97fb0a57e1 (diff) |
Remove gui dependencies from alacritty_terminal
This commit removes font dependency from alacritty_terminal,
so it'll simplify the usage of alacritty_terminal as a library,
since you won't link to system's libraries anymore. It also
moves many alacritty related config options from it.
Fixes #3393.
Diffstat (limited to 'alacritty_terminal')
-rw-r--r-- | alacritty_terminal/Cargo.toml | 5 | ||||
-rw-r--r-- | alacritty_terminal/src/config/debug.rs | 64 | ||||
-rw-r--r-- | alacritty_terminal/src/config/font.rs | 216 | ||||
-rw-r--r-- | alacritty_terminal/src/config/mod.rs | 106 | ||||
-rw-r--r-- | alacritty_terminal/src/config/window.rs | 215 | ||||
-rw-r--r-- | alacritty_terminal/src/event.rs | 2 | ||||
-rw-r--r-- | alacritty_terminal/src/event_loop.rs | 10 | ||||
-rw-r--r-- | alacritty_terminal/src/lib.rs | 10 | ||||
-rw-r--r-- | alacritty_terminal/src/locale.rs | 99 | ||||
-rw-r--r-- | alacritty_terminal/src/message_bar.rs | 433 | ||||
-rw-r--r-- | alacritty_terminal/src/meter.rs | 97 | ||||
-rw-r--r-- | alacritty_terminal/src/panic.rs | 30 | ||||
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 32 | ||||
-rw-r--r-- | alacritty_terminal/src/tty/windows/conpty.rs | 3 |
14 files changed, 24 insertions, 1298 deletions
diff --git a/alacritty_terminal/Cargo.toml b/alacritty_terminal/Cargo.toml index 3e796ba6..15edec3f 100644 --- a/alacritty_terminal/Cargo.toml +++ b/alacritty_terminal/Cargo.toml @@ -11,7 +11,6 @@ edition = "2018" [dependencies] libc = "0.2" bitflags = "1" -font = { path = "../font", features = ["force_system_fontconfig"] } parking_lot = "0.10.2" serde = { version = "1", features = ["derive"] } serde_yaml = "0.8" @@ -38,12 +37,8 @@ winapi = { version = "0.3.7", features = [ ]} mio-anonymous-pipes = "0.1" -[target.'cfg(target_os = "macos")'.dependencies] -objc = "0.2.2" - [features] default = ["winpty"] -nightly = [] bench = [] [dev-dependencies] diff --git a/alacritty_terminal/src/config/debug.rs b/alacritty_terminal/src/config/debug.rs deleted file mode 100644 index 9c9d4fde..00000000 --- a/alacritty_terminal/src/config/debug.rs +++ /dev/null @@ -1,64 +0,0 @@ -use log::{error, LevelFilter}; -use serde::{Deserialize, Deserializer}; - -use crate::config::{failure_default, LOG_TARGET_CONFIG}; - -/// Debugging options. -#[serde(default)] -#[derive(Deserialize, Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -pub struct Debug { - #[serde(default = "default_log_level", deserialize_with = "deserialize_log_level")] - pub log_level: LevelFilter, - - #[serde(deserialize_with = "failure_default")] - pub print_events: bool, - - /// Keep the log file after quitting. - #[serde(deserialize_with = "failure_default")] - pub persistent_logging: bool, - - /// Should show render timer. - #[serde(deserialize_with = "failure_default")] - pub render_timer: bool, - - /// Record ref test. - #[serde(skip)] - pub ref_test: bool, -} - -impl Default for Debug { - fn default() -> Self { - Self { - log_level: default_log_level(), - print_events: Default::default(), - persistent_logging: Default::default(), - render_timer: Default::default(), - ref_test: Default::default(), - } - } -} - -fn default_log_level() -> LevelFilter { - LevelFilter::Warn -} - -fn deserialize_log_level<'a, D>(deserializer: D) -> Result<LevelFilter, D::Error> -where - D: Deserializer<'a>, -{ - Ok(match failure_default::<D, String>(deserializer)?.to_lowercase().as_str() { - "off" | "none" => LevelFilter::Off, - "error" => LevelFilter::Error, - "warn" => LevelFilter::Warn, - "info" => LevelFilter::Info, - "debug" => LevelFilter::Debug, - "trace" => LevelFilter::Trace, - level => { - error!( - target: LOG_TARGET_CONFIG, - "Problem with config: invalid log level {}; using level Warn", level - ); - default_log_level() - }, - }) -} diff --git a/alacritty_terminal/src/config/font.rs b/alacritty_terminal/src/config/font.rs deleted file mode 100644 index 6a9120c9..00000000 --- a/alacritty_terminal/src/config/font.rs +++ /dev/null @@ -1,216 +0,0 @@ -use std::fmt; - -use font::Size; -use log::error; -use serde::de::Visitor; -use serde::{Deserialize, Deserializer}; - -#[cfg(target_os = "macos")] -use crate::config::DefaultTrueBool; -use crate::config::{failure_default, Delta, LOG_TARGET_CONFIG}; - -/// Font config. -/// -/// Defaults are provided at the level of this struct per platform, but not per -/// field in this struct. It might be nice in the future to have defaults for -/// each value independently. Alternatively, maybe erroring when the user -/// doesn't provide complete config is Ok. -#[serde(default)] -#[derive(Debug, Deserialize, Clone, PartialEq, Eq)] -pub struct Font { - /// Normal font face. - #[serde(deserialize_with = "failure_default")] - normal: FontDescription, - - /// Bold font face. - #[serde(deserialize_with = "failure_default")] - bold: SecondaryFontDescription, - - /// Italic font face. - #[serde(deserialize_with = "failure_default")] - italic: SecondaryFontDescription, - - /// Bold italic font face. - #[serde(deserialize_with = "failure_default")] - bold_italic: SecondaryFontDescription, - - /// Font size in points. - #[serde(deserialize_with = "DeserializeSize::deserialize")] - pub size: Size, - - /// Extra spacing per character. - #[serde(deserialize_with = "failure_default")] - pub offset: Delta<i8>, - - /// Glyph offset within character cell. - #[serde(deserialize_with = "failure_default")] - pub glyph_offset: Delta<i8>, - - #[cfg(target_os = "macos")] - #[serde(deserialize_with = "failure_default")] - use_thin_strokes: DefaultTrueBool, -} - -impl Default for Font { - fn default() -> Font { - Font { - size: default_font_size(), - normal: Default::default(), - bold: Default::default(), - italic: Default::default(), - bold_italic: Default::default(), - glyph_offset: Default::default(), - offset: Default::default(), - #[cfg(target_os = "macos")] - use_thin_strokes: Default::default(), - } - } -} - -impl Font { - /// Get a font clone with a size modification. - pub fn with_size(self, size: Size) -> Font { - Font { size, ..self } - } - - /// Get normal font description. - pub fn normal(&self) -> &FontDescription { - &self.normal - } - - /// Get bold font description. - pub fn bold(&self) -> FontDescription { - self.bold.desc(&self.normal) - } - - /// Get italic font description. - pub fn italic(&self) -> FontDescription { - self.italic.desc(&self.normal) - } - - /// Get bold italic font description. - pub fn bold_italic(&self) -> FontDescription { - self.bold_italic.desc(&self.normal) - } - - #[cfg(target_os = "macos")] - pub fn use_thin_strokes(&self) -> bool { - self.use_thin_strokes.0 - } - - #[cfg(not(target_os = "macos"))] - pub fn use_thin_strokes(&self) -> bool { - false - } -} - -fn default_font_size() -> Size { - Size::new(11.) -} - -/// Description of the normal font. -#[serde(default)] -#[derive(Debug, Deserialize, Clone, PartialEq, Eq)] -pub struct FontDescription { - #[serde(deserialize_with = "failure_default")] - pub family: String, - #[serde(deserialize_with = "failure_default")] - pub style: Option<String>, -} - -impl Default for FontDescription { - fn default() -> FontDescription { - FontDescription { - #[cfg(not(any(target_os = "macos", windows)))] - family: "monospace".into(), - #[cfg(target_os = "macos")] - family: "Menlo".into(), - #[cfg(windows)] - family: "Consolas".into(), - style: None, - } - } -} - -/// Description of the italic and bold font. -#[serde(default)] -#[derive(Debug, Default, Deserialize, Clone, PartialEq, Eq)] -pub struct SecondaryFontDescription { - #[serde(deserialize_with = "failure_default")] - family: Option<String>, - #[serde(deserialize_with = "failure_default")] - style: Option<String>, -} - -impl SecondaryFontDescription { - pub fn desc(&self, fallback: &FontDescription) -> FontDescription { - FontDescription { - family: self.family.clone().unwrap_or_else(|| fallback.family.clone()), - style: self.style.clone(), - } - } -} - -trait DeserializeSize: Sized { - fn deserialize<'a, D>(_: D) -> ::std::result::Result<Self, D::Error> - where - D: serde::de::Deserializer<'a>; -} - -impl DeserializeSize for Size { - fn deserialize<'a, D>(deserializer: D) -> ::std::result::Result<Self, D::Error> - where - D: serde::de::Deserializer<'a>, - { - use std::marker::PhantomData; - - struct NumVisitor<__D> { - _marker: PhantomData<__D>, - } - - impl<'a, __D> Visitor<'a> for NumVisitor<__D> - where - __D: serde::de::Deserializer<'a>, - { - type Value = f64; - - fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.write_str("f64 or u64") - } - - fn visit_f64<E>(self, value: f64) -> ::std::result::Result<Self::Value, E> - where - E: ::serde::de::Error, - { - Ok(value) - } - - fn visit_u64<E>(self, value: u64) -> ::std::result::Result<Self::Value, E> - where - E: ::serde::de::Error, - { - Ok(value as f64) - } - } - - let value = serde_yaml::Value::deserialize(deserializer)?; - let size = value - .deserialize_any(NumVisitor::<D> { _marker: PhantomData }) - .map(|v| Size::new(v as _)); - - // Use default font size as fallback. - match size { - Ok(size) => Ok(size), - Err(err) => { - let size = default_font_size(); - error!( - target: LOG_TARGET_CONFIG, - "Problem with config: {}; using size {}", - err, - size.as_f32_pts() - ); - Ok(size) - }, - } - } -} diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs index 83dcd7b8..98579a69 100644 --- a/alacritty_terminal/src/config/mod.rs +++ b/alacritty_terminal/src/config/mod.rs @@ -8,19 +8,13 @@ use serde_yaml::Value; mod bell; mod colors; -mod debug; -mod font; mod scrolling; -mod window; use crate::ansi::CursorStyle; pub use crate::config::bell::{BellAnimation, BellConfig}; pub use crate::config::colors::Colors; -pub use crate::config::debug::Debug; -pub use crate::config::font::{Font, FontDescription}; pub use crate::config::scrolling::Scrolling; -pub use crate::config::window::{Decorations, Dimensions, StartupMode, WindowConfig, DEFAULT_NAME}; pub const LOG_TARGET_CONFIG: &str = "alacritty_config"; const MAX_SCROLLBACK_LINES: u32 = 100_000; @@ -31,18 +25,10 @@ pub type MockConfig = Config<HashMap<String, serde_yaml::Value>>; /// Top-level config type. #[derive(Debug, PartialEq, Default, Deserialize)] pub struct Config<T> { - /// Pixel padding. - #[serde(default, deserialize_with = "failure_default")] - pub padding: Option<Delta<u8>>, - /// TERM env variable. #[serde(default, deserialize_with = "failure_default")] pub env: HashMap<String, String>, - /// Font configuration. - #[serde(default, deserialize_with = "failure_default")] - pub font: Font, - /// Should draw bold text with brighter colors instead of bold font. #[serde(default, deserialize_with = "failure_default")] draw_bold_text_with_bright_colors: bool, @@ -50,14 +36,6 @@ pub struct Config<T> { #[serde(default, deserialize_with = "failure_default")] pub colors: Colors, - /// Background opacity from 0.0 to 1.0. - #[serde(default, deserialize_with = "failure_default")] - background_opacity: Percentage, - - /// Window configuration. - #[serde(default, deserialize_with = "failure_default")] - pub window: WindowConfig, - #[serde(default, deserialize_with = "failure_default")] pub selection: Selection, @@ -73,14 +51,6 @@ pub struct Config<T> { #[serde(default, deserialize_with = "failure_default")] bell: BellConfig, - /// Use dynamic title. - #[serde(default, deserialize_with = "failure_default")] - dynamic_title: DefaultTrueBool, - - /// Live config reload. - #[serde(default, deserialize_with = "failure_default")] - live_config_reload: DefaultTrueBool, - /// How much scrolling history to keep. #[serde(default, deserialize_with = "failure_default")] pub scrolling: Scrolling, @@ -94,18 +64,10 @@ pub struct Config<T> { #[serde(default, deserialize_with = "failure_default")] pub winpty_backend: bool, - /// Send escape sequences using the alt key. - #[serde(default, deserialize_with = "failure_default")] - alt_send_esc: DefaultTrueBool, - /// Shell startup directory. #[serde(default, deserialize_with = "option_explicit_none")] pub working_directory: Option<PathBuf>, - /// Debug options. - #[serde(default, deserialize_with = "failure_default")] - pub debug: Debug, - /// Additional configuration options not directly required by the terminal. #[serde(flatten)] pub ui_config: T, @@ -121,14 +83,6 @@ pub struct Config<T> { // TODO: REMOVED #[serde(default, deserialize_with = "failure_default")] pub tabspaces: Option<usize>, - - // TODO: DEPRECATED - #[serde(default, deserialize_with = "failure_default")] - pub render_timer: Option<bool>, - - // TODO: DEPRECATED - #[serde(default, deserialize_with = "failure_default")] - pub persistent_logging: Option<bool>, } impl<T> Config<T> { @@ -137,50 +91,6 @@ impl<T> Config<T> { self.draw_bold_text_with_bright_colors } - /// Should show render timer. - #[inline] - pub fn render_timer(&self) -> bool { - self.render_timer.unwrap_or(self.debug.render_timer) - } - - /// Live config reload. - #[inline] - pub fn live_config_reload(&self) -> bool { - self.live_config_reload.0 - } - - #[inline] - pub fn set_live_config_reload(&mut self, live_config_reload: bool) { - self.live_config_reload.0 = live_config_reload; - } - - #[inline] - pub fn dynamic_title(&self) -> bool { - self.dynamic_title.0 - } - - #[inline] - pub fn set_dynamic_title(&mut self, dynamic_title: bool) { - self.dynamic_title.0 = dynamic_title; - } - - /// Send escape sequences using the alt key. - #[inline] - pub fn alt_send_esc(&self) -> bool { - self.alt_send_esc.0 - } - - /// Keep the log file after quitting Alacritty. - #[inline] - pub fn persistent_logging(&self) -> bool { - self.persistent_logging.unwrap_or(self.debug.persistent_logging) - } - - #[inline] - pub fn background_opacity(&self) -> f32 { - self.background_opacity.0 as f32 - } - #[inline] pub fn bell(&self) -> &BellConfig { self.visual_bell.as_ref().unwrap_or(&self.bell) @@ -294,18 +204,6 @@ impl Program { } } -/// A delta for a point in a 2 dimensional plane. -#[serde(default, bound(deserialize = "T: Deserialize<'de> + Default"))] -#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Eq)] -pub struct Delta<T: Default + PartialEq + Eq> { - /// Horizontal change. - #[serde(deserialize_with = "failure_default")] - pub x: T, - /// Vertical change. - #[serde(deserialize_with = "failure_default")] - pub y: T, -} - /// Wrapper around f32 that represents a percentage value between 0.0 and 1.0. #[derive(Clone, Copy, Debug, PartialEq)] pub struct Percentage(f32); @@ -320,6 +218,10 @@ impl Percentage { value }) } + + pub fn as_f32(self) -> f32 { + self.0 + } } impl Default for Percentage { diff --git a/alacritty_terminal/src/config/window.rs b/alacritty_terminal/src/config/window.rs deleted file mode 100644 index b410f0a2..00000000 --- a/alacritty_terminal/src/config/window.rs +++ /dev/null @@ -1,215 +0,0 @@ -use std::os::raw::c_ulong; - -use log::error; -use serde::{Deserialize, Deserializer}; -use serde_yaml::Value; - -use crate::config::{failure_default, option_explicit_none, Delta, LOG_TARGET_CONFIG}; -use crate::index::{Column, Line}; - -/// Default Alacritty name, used for window title and class. -pub const DEFAULT_NAME: &str = "Alacritty"; - -#[serde(default)] -#[derive(Deserialize, Debug, Clone, PartialEq, Eq)] -pub struct WindowConfig { - /// Initial dimensions. - #[serde(deserialize_with = "failure_default")] - pub dimensions: Dimensions, - - /// Initial position. - #[serde(deserialize_with = "failure_default")] - pub position: Option<Delta<i32>>, - - /// Pixel padding. - #[serde(deserialize_with = "failure_default")] - pub padding: Delta<u8>, - - /// Draw the window with title bar / borders. - #[serde(deserialize_with = "failure_default")] - pub decorations: Decorations, - - /// Spread out additional padding evenly. - #[serde(deserialize_with = "failure_default")] - pub dynamic_padding: bool, - - /// Startup mode. - #[serde(deserialize_with = "failure_default")] - startup_mode: StartupMode, - - /// Window title. - #[serde(default = "default_title")] - pub title: String, - - /// Window class. - #[serde(deserialize_with = "deserialize_class")] - pub class: Class, - - /// XEmbed parent. - #[serde(skip)] - pub embed: Option<c_ulong>, - - /// GTK theme variant. - #[serde(deserialize_with = "option_explicit_none")] - pub gtk_theme_variant: Option<String>, - - // TODO: DEPRECATED - #[serde(deserialize_with = "failure_default")] - pub start_maximized: Option<bool>, -} - -pub fn default_title() -> String { - DEFAULT_NAME.to_string() -} - -impl WindowConfig { - pub fn startup_mode(&self) -> StartupMode { - match self.start_maximized { - Some(true) => StartupMode::Maximized, - _ => self.startup_mode, - } - } -} - -impl Default for WindowConfig { - fn default() -> WindowConfig { - WindowConfig { - dimensions: Default::default(), - position: Default::default(), - padding: Default::default(), - decorations: Default::default(), - dynamic_padding: Default::default(), - startup_mode: Default::default(), - class: Default::default(), - embed: Default::default(), - gtk_theme_variant: Default::default(), - start_maximized: Default::default(), - title: default_title(), - } - } -} - -#[derive(Debug, Deserialize, Copy, Clone, PartialEq, Eq)] -pub enum StartupMode { - Windowed, - Maximized, - Fullscreen, - #[cfg(target_os = "macos")] - SimpleFullscreen, -} - -impl Default for StartupMode { - fn default() -> StartupMode { - StartupMode::Windowed - } -} - -#[derive(Debug, Copy, Clone, PartialEq, Eq, Deserialize)] -pub enum Decorations { - #[serde(rename = "full")] - Full, - #[cfg(target_os = "macos")] - #[serde(rename = "transparent")] - Transparent, - #[cfg(target_os = "macos")] - #[serde(rename = "buttonless")] - Buttonless, - #[serde(rename = "none")] - None, -} - -impl Default for Decorations { - fn default() -> Decorations { - Decorations::Full - } -} - -/// Window Dimensions. -/// -/// Newtype to avoid passing values incorrectly. -#[serde(default)] -#[derive(Default, Debug, Copy, Clone, Deserialize, PartialEq, Eq)] -pub struct Dimensions { - /// Window width in character columns. - #[serde(deserialize_with = "failure_default")] - columns: Column, - - /// Window Height in character lines. - #[serde(deserialize_with = "failure_default")] - lines: Line, -} - -impl Dimensions { - pub fn new(columns: Column, lines: Line) -> Self { - Dimensions { columns, lines } - } - - /// Get lines. - #[inline] - pub fn lines_u32(&self) -> u32 { - self.lines.0 as u32 - } - - /// Get columns. - #[inline] - pub fn columns_u32(&self) -> u32 { - self.columns.0 as u32 - } -} - -/// Window class hint. -#[serde(default)] -#[derive(Deserialize, Debug, Clone, PartialEq, Eq)] -pub struct Class { - #[serde(deserialize_with = "deserialize_class_resource")] - pub instance: String, - - #[serde(deserialize_with = "deserialize_class_resource")] - pub general: String, -} - -impl Default for Class { - fn default() -> Self { - Class { instance: DEFAULT_NAME.into(), general: DEFAULT_NAME.into() } - } -} - -fn deserialize_class_resource<'a, D>(deserializer: D) -> Result<String, D::Error> -where - D: Deserializer<'a>, -{ - let value = Value::deserialize(deserializer)?; - match String::deserialize(value) { - Ok(value) => Ok(value), - Err(err) => { - error!( - target: LOG_TARGET_CONFIG, - "Problem with config: {}, using default value {}", err, DEFAULT_NAME, - ); - - Ok(DEFAULT_NAME.into()) - }, - } -} - -fn deserialize_class<'a, D>(deserializer: D) -> Result<Class, D::Error> -where - D: Deserializer<'a>, -{ - let value = Value::deserialize(deserializer)?; - - if let Value::String(instance) = value { - return Ok(Class { instance, general: DEFAULT_NAME.into() }); - } - - match Class::deserialize(value) { - Ok(value) => Ok(value), - Err(err) => { - error!( - target: LOG_TARGET_CONFIG, - "Problem with config: {}; using class {}", err, DEFAULT_NAME - ); - Ok(Class::default()) - }, - } -} diff --git a/alacritty_terminal/src/event.rs b/alacritty_terminal/src/event.rs index 863a2fbf..c7129b24 100644 --- a/alacritty_terminal/src/event.rs +++ b/alacritty_terminal/src/event.rs @@ -8,6 +8,7 @@ use crate::term::{ClipboardType, SizeInfo}; pub enum Event { MouseCursorDirty, Title(String), + ResetTitle, ClipboardStore(ClipboardType, String), ClipboardLoad(ClipboardType, Arc<dyn Fn(&str) -> String + Sync + Send + 'static>), Wakeup, @@ -20,6 +21,7 @@ impl Debug for Event { match self { Event::MouseCursorDirty => write!(f, "MouseCursorDirty"), Event::Title(title) => write!(f, "Title({})", title), + Event::ResetTitle => write!(f, "ResetTitle"), Event::ClipboardStore(ty, text) => write!(f, "ClipboardStore({:?}, {})", ty, text), Event::ClipboardLoad(ty, _) => write!(f, "ClipboardLoad({:?})", ty), Event::Wakeup => write!(f, "Wakeup"), diff --git a/alacritty_terminal/src/event_loop.rs b/alacritty_terminal/src/event_loop.rs index 156510b0..43e8a302 100644 --- a/alacritty_terminal/src/event_loop.rs +++ b/alacritty_terminal/src/event_loop.rs @@ -15,7 +15,6 @@ use mio::{self, Events, PollOpt, Ready}; use mio_extras::channel::{self, Receiver, Sender}; use crate::ansi; -use crate::config::Config; use crate::event::{self, Event, EventListener}; use crate::sync::FairMutex; use crate::term::{SizeInfo, Term}; @@ -155,11 +154,12 @@ where U: EventListener + Send + 'static, { /// Create a new event loop. - pub fn new<V>( + pub fn new( terminal: Arc<FairMutex<Term<U>>>, event_proxy: U, pty: T, - config: &Config<V>, + hold: bool, + ref_test: bool, ) -> EventLoop<T, U> { let (tx, rx) = channel::channel(); EventLoop { @@ -169,8 +169,8 @@ where rx, terminal, event_proxy, - hold: config.hold, - ref_test: config.debug.ref_test, + hold, + ref_test, } } diff --git a/alacritty_terminal/src/lib.rs b/alacritty_terminal/src/lib.rs index 7130218b..2f3beeb0 100644 --- a/alacritty_terminal/src/lib.rs +++ b/alacritty_terminal/src/lib.rs @@ -1,24 +1,14 @@ //! Alacritty - The GPU Enhanced Terminal. #![deny(clippy::all, clippy::if_not_else, clippy::enum_glob_use, clippy::wrong_pub_self_convention)] -#![cfg_attr(feature = "nightly", feature(core_intrinsics))] #![cfg_attr(all(test, feature = "bench"), feature(test))] -#[cfg(target_os = "macos")] -#[macro_use] -extern crate objc; - pub mod ansi; pub mod config; pub mod event; pub mod event_loop; pub mod grid; pub mod index; -#[cfg(target_os = "macos")] -pub mod locale; -pub mod message_bar; -pub mod meter; -pub mod panic; pub mod selection; pub mod sync; pub mod term; diff --git a/alacritty_terminal/src/locale.rs b/alacritty_terminal/src/locale.rs deleted file mode 100644 index 0a72e775..00000000 --- a/alacritty_terminal/src/locale.rs +++ /dev/null @@ -1,99 +0,0 @@ -#![allow(clippy::let_unit_value)] - -use std::env; -use std::ffi::{CStr, CString}; -use std::os::raw::c_char; -use std::slice; -use std::str; - -use libc::{setlocale, LC_ALL, LC_CTYPE}; -use log::debug; -use objc::runtime::{Class, Object}; - -const FALLBACK_LOCALE: &str = "UTF-8"; - -pub fn set_locale_environment() { - let env_locale_c = CString::new("").unwrap(); - let env_locale_ptr = unsafe { setlocale(LC_ALL, env_locale_c.as_ptr()) }; - if !env_locale_ptr.is_null() { - let env_locale = unsafe { CStr::from_ptr(env_locale_ptr).to_string_lossy() }; - - // Assume `C` locale means unchanged, since it is the default anyways. - if env_locale != "C" { - debug!("Using environment locale: {}", env_locale); - return; - } - } - - let system_locale = system_locale(); - - // Set locale to system locale. - let system_locale_c = CString::new(system_locale.clone()).expect("nul byte in system locale"); - let lc_all = unsafe { setlocale(LC_ALL, system_locale_c.as_ptr()) }; - - // Check if system locale was valid or not. - if lc_all.is_null() { - // Use fallback locale. - debug!("Using fallback locale: {}", FALLBACK_LOCALE); - - let fallback_locale_c = CString::new(FALLBACK_LOCALE).unwrap(); - unsafe { setlocale(LC_CTYPE, fallback_locale_c.as_ptr()) }; - - env::set_var("LC_CTYPE", FALLBACK_LOCALE); - } else { - // Use system locale. - debug!("Using system locale: {}", system_locale); - - env::set_var("LC_ALL", system_locale); - } -} - -/// Determine system locale based on language and country code. -fn system_locale() -> String { - unsafe { - let locale_class = Class::get("NSLocale").unwrap(); - let locale: *const Object = msg_send![locale_class, currentLocale]; - let _: () = msg_send![locale_class, release]; - - // `localeIdentifier` returns extra metadata with the locale (including currency and - // collator) on newer versions of macOS. This is not a valid locale, so we use - // `languageCode` and `countryCode`, if they're available (macOS 10.12+): - // - // https://developer.apple.com/documentation/foundation/nslocale/1416263-localeidentifier?language=objc - // https://developer.apple.com/documentation/foundation/nslocale/1643060-countrycode?language=objc - // https://developer.apple.com/documentation/foundation/nslocale/1643026-languagecode?language=objc - let is_language_code_supported: bool = - msg_send![locale, respondsToSelector: sel!(languageCode)]; - let is_country_code_supported: bool = - msg_send![locale, respondsToSelector: sel!(countryCode)]; - let locale_id = if is_language_code_supported && is_country_code_supported { - let language_code: *const Object = msg_send![locale, languageCode]; - let language_code_str = nsstring_as_str(language_code).to_owned(); - let _: () = msg_send![language_code, release]; - - let country_code: *const Object = msg_send![locale, countryCode]; - let country_code_str = nsstring_as_str(country_code).to_owned(); - let _: () = msg_send![country_code, release]; - - format!("{}_{}.UTF-8", &language_code_str, &country_code_str) - } else { - let identifier: *const Object = msg_send![locale, localeIdentifier]; - let identifier_str = nsstring_as_str(identifier).to_owned(); - let _: () = msg_send![identifier, release]; - - identifier_str + ".UTF-8" - }; - - let _: () = msg_send![locale, release]; - - locale_id - } -} - -const UTF8_ENCODING: usize = 4; - -unsafe fn nsstring_as_str<'a>(nsstring: *const Object) -> &'a str { - let cstr: *const c_char = msg_send![nsstring, UTF8String]; - let len: usize = msg_send![nsstring, lengthOfBytesUsingEncoding: UTF8_ENCODING]; - str::from_utf8(slice::from_raw_parts(cstr as *const u8, len)).unwrap() -} diff --git a/alacritty_terminal/src/message_bar.rs b/alacritty_terminal/src/message_bar.rs deleted file mode 10064 |