diff options
-rw-r--r-- | alacritty/src/cli.rs | 49 | ||||
-rw-r--r-- | alacritty/src/display/hint.rs | 3 | ||||
-rw-r--r-- | alacritty/src/event.rs | 31 | ||||
-rw-r--r-- | alacritty/src/input.rs | 9 | ||||
-rw-r--r-- | alacritty/src/ipc.rs | 4 | ||||
-rw-r--r-- | alacritty/src/main.rs | 5 | ||||
-rw-r--r-- | alacritty/src/window_context.rs | 10 | ||||
-rw-r--r-- | alacritty_terminal/src/ansi.rs | 2 | ||||
-rw-r--r-- | alacritty_terminal/src/index.rs | 2 |
9 files changed, 55 insertions, 60 deletions
diff --git a/alacritty/src/cli.rs b/alacritty/src/cli.rs index 9b1b8e6c..21062fce 100644 --- a/alacritty/src/cli.rs +++ b/alacritty/src/cli.rs @@ -100,21 +100,6 @@ impl Options { /// Override configuration file with options from the CLI. pub fn override_config(&self, config: &mut UiConfig) { - if let Some(working_directory) = &self.terminal_options.working_directory { - if working_directory.is_dir() { - config.terminal_config.pty_config.working_directory = - Some(working_directory.to_owned()); - } else { - error!("Invalid working directory: {:?}", working_directory); - } - } - - if let Some(command) = self.terminal_options.command() { - config.terminal_config.pty_config.shell = Some(command); - } - - config.terminal_config.pty_config.hold = self.terminal_options.hold; - if let Some(title) = self.title.clone() { config.window.title = title } @@ -218,27 +203,37 @@ pub struct TerminalOptions { } impl TerminalOptions { - pub fn new() -> Self { - Default::default() - } - - pub fn is_empty(&self) -> bool { - self.working_directory.is_none() && !self.hold && self.command.is_empty() - } - /// Shell override passed through the CLI. pub fn command(&self) -> Option<Program> { let (program, args) = self.command.split_first()?; 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) { + if let Some(working_directory) = &self.working_directory { + if working_directory.is_dir() { + pty_config.working_directory = Some(working_directory.to_owned()); + } else { + error!("Invalid working directory: {:?}", working_directory); + } + } + + if let Some(command) = self.command() { + pty_config.shell = Some(command); + } + + pty_config.hold |= self.hold; + } } impl From<TerminalOptions> for PtyConfig { fn from(mut options: TerminalOptions) -> Self { - let working_directory = options.working_directory.take(); - let shell = options.command(); - let hold = options.hold; - PtyConfig { shell, working_directory, hold } + PtyConfig { + working_directory: options.working_directory.take(), + shell: options.command(), + hold: options.hold, + } } } diff --git a/alacritty/src/display/hint.rs b/alacritty/src/display/hint.rs index c318fc09..d554993b 100644 --- a/alacritty/src/display/hint.rs +++ b/alacritty/src/display/hint.rs @@ -78,8 +78,7 @@ impl HintState { if hint.post_processing { matches .drain(..) - .map(|rm| HintPostProcessor::new(term, regex, rm).collect::<Vec<_>>()) - .flatten() + .flat_map(|rm| HintPostProcessor::new(term, regex, rm).collect::<Vec<_>>()) .collect() } else { matches.0 diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index 8ce3b2e0..c2baddf8 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -34,7 +34,7 @@ use alacritty_terminal::selection::{Selection, SelectionType}; use alacritty_terminal::term::search::{Match, RegexSearch}; use alacritty_terminal::term::{ClipboardType, SizeInfo, Term, TermMode}; -use crate::cli::{Options as CliOptions, TerminalOptions as TerminalCliOptions}; +use crate::cli::{Options as CliOptions, TerminalOptions}; use crate::clipboard::Clipboard; use crate::config::ui_config::{HintAction, HintInternalAction}; use crate::config::{self, UiConfig}; @@ -88,7 +88,7 @@ pub enum EventType { ConfigReload(PathBuf), Message(Message), Scroll(Scroll), - CreateWindow(Option<TerminalCliOptions>), + CreateWindow(TerminalOptions), BlinkCursor, SearchNext, } @@ -379,21 +379,19 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon #[cfg(not(windows))] fn create_new_window(&mut self) { - let cwd = foreground_process_path(self.master_fd, self.shell_pid); - let options = if let Ok(working_directory) = cwd { - let mut options = TerminalCliOptions::new(); + let mut options = TerminalOptions::default(); + if let Ok(working_directory) = foreground_process_path(self.master_fd, self.shell_pid) { options.working_directory = Some(working_directory); - Some(options) - } else { - None - }; + } let _ = self.event_proxy.send_event(Event::new(EventType::CreateWindow(options), None)); } #[cfg(windows)] fn create_new_window(&mut self) { - let _ = self.event_proxy.send_event(Event::new(EventType::CreateWindow(None), None)); + let _ = self + .event_proxy + .send_event(Event::new(EventType::CreateWindow(TerminalOptions::default()), None)); } fn spawn_daemon<I, S>(&self, program: &str, args: I) @@ -753,7 +751,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon } } else if self.terminal().mode().contains(TermMode::BRACKETED_PASTE) { self.write_to_pty(&b"\x1b[200~"[..]); - self.write_to_pty(text.replace("\x1b", "").into_bytes()); + self.write_to_pty(text.replace('\x1b', "").into_bytes()); self.write_to_pty(&b"\x1b[201~"[..]); } else { // In non-bracketed (ie: normal) mode, terminal applications cannot distinguish @@ -762,7 +760,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon // pasting... since that's neither practical nor sensible (and probably an impossible // task to solve in a general way), we'll just replace line breaks (windows and unix // style) with a single carriage return (\r, which is what the Enter key produces). - self.write_to_pty(text.replace("\r\n", "\r").replace("\n", "\r").into_bytes()); + self.write_to_pty(text.replace("\r\n", "\r").replace('\n', "\r").into_bytes()); } } @@ -1207,12 +1205,15 @@ impl Processor { pub fn create_window( &mut self, event_loop: &EventLoopWindowTarget<Event>, - options: Option<TerminalCliOptions>, proxy: EventLoopProxy<Event>, + options: TerminalOptions, ) -> Result<(), Box<dyn Error>> { + let mut pty_config = self.config.terminal_config.pty_config.clone(); + options.override_pty_config(&mut pty_config); + let window_context = WindowContext::new( &self.config, - options, + &pty_config, event_loop, proxy, #[cfg(all(feature = "wayland", not(any(target_os = "macos", windows))))] @@ -1320,7 +1321,7 @@ impl Processor { GlutinEvent::UserEvent(Event { payload: EventType::CreateWindow(options), .. }) => { - if let Err(err) = self.create_window(event_loop, options, proxy.clone()) { + if let Err(err) = self.create_window(event_loop, proxy.clone(), options) { error!("Could not open window: {:?}", err); } }, diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs index 40b18ca2..466fe130 100644 --- a/alacritty/src/input.rs +++ b/alacritty/src/input.rs @@ -802,11 +802,8 @@ impl<T: EventListener, A: ActionContext<T>> Processor<T, A> { self.ctx.clear_selection(); let utf8_len = c.len_utf8(); - let mut bytes = Vec::with_capacity(utf8_len); - unsafe { - bytes.set_len(utf8_len); - c.encode_utf8(&mut bytes[..]); - } + let mut bytes = vec![0; utf8_len]; + c.encode_utf8(&mut bytes[..]); if self.ctx.config().alt_send_esc && *self.ctx.received_count() == 0 @@ -1007,7 +1004,7 @@ mod tests { } fn terminal_mut(&mut self) -> &mut Term<T> { - &mut self.terminal + self.terminal } fn size_info(&self) -> SizeInfo { diff --git a/alacritty/src/ipc.rs b/alacritty/src/ipc.rs index 6f02e757..a71b5139 100644 --- a/alacritty/src/ipc.rs +++ b/alacritty/src/ipc.rs @@ -58,8 +58,8 @@ pub fn spawn_ipc_socket(options: &Options, event_proxy: EventLoopProxy<Event>) - // Handle IPC events. match message { - SocketMessage::CreateWindow(terminal_options) => { - let event = Event::new(EventType::CreateWindow(Some(terminal_options)), None); + SocketMessage::CreateWindow(options) => { + let event = Event::new(EventType::CreateWindow(options), None); let _ = event_proxy.send_event(event); }, } diff --git a/alacritty/src/main.rs b/alacritty/src/main.rs index a5624a7b..0af1c01b 100644 --- a/alacritty/src/main.rs +++ b/alacritty/src/main.rs @@ -178,11 +178,14 @@ fn alacritty(options: Options) -> Result<(), String> { }; // Event processor. + let cli_options = options.terminal_options.clone(); let mut processor = Processor::new(config, options, &window_event_loop); // Create the first Alacritty window. let proxy = window_event_loop.create_proxy(); - processor.create_window(&window_event_loop, None, proxy).map_err(|err| err.to_string())?; + processor + .create_window(&window_event_loop, proxy, cli_options) + .map_err(|err| err.to_string())?; info!("Initialisation complete"); diff --git a/alacritty/src/window_context.rs b/alacritty/src/window_context.rs index d7a6b41e..130f42d6 100644 --- a/alacritty/src/window_context.rs +++ b/alacritty/src/window_context.rs @@ -1,6 +1,5 @@ //! Terminal window context. -use std::borrow::Cow; use std::error::Error; use std::fs::File; use std::io::Write; @@ -20,6 +19,7 @@ use serde_json as json; #[cfg(all(feature = "wayland", not(any(target_os = "macos", windows))))] use wayland_client::EventQueue; +use alacritty_terminal::config::PtyConfig; use alacritty_terminal::event::Event as TerminalEvent; use alacritty_terminal::event_loop::{EventLoop as PtyEventLoop, Msg, Notifier}; use alacritty_terminal::grid::{Dimensions, Scroll}; @@ -28,7 +28,6 @@ use alacritty_terminal::sync::FairMutex; use alacritty_terminal::term::{Term, TermMode}; use alacritty_terminal::tty; -use crate::cli::TerminalOptions as TerminalCliOptions; use crate::clipboard::Clipboard; use crate::config::UiConfig; use crate::display::Display; @@ -61,7 +60,7 @@ impl WindowContext { /// Create a new terminal window context. pub fn new( config: &UiConfig, - options: Option<TerminalCliOptions>, + pty_config: &PtyConfig, window_event_loop: &EventLoopWindowTarget<Event>, proxy: EventLoopProxy<Event>, #[cfg(all(feature = "wayland", not(any(target_os = "macos", windows))))] @@ -98,10 +97,7 @@ impl WindowContext { // The PTY forks a process to run the shell on the slave side of the // pseudoterminal. A file descriptor for the master side is retained for // reading/writing to the shell. - let pty_config = options - .map(|o| Cow::Owned(o.into())) - .unwrap_or(Cow::Borrowed(&config.terminal_config.pty_config)); - let pty = tty::new(&pty_config, &display.size_info, display.window.x11_window_id())?; + let pty = tty::new(pty_config, &display.size_info, display.window.x11_window_id())?; #[cfg(not(windows))] let master_fd = pty.file().as_raw_fd(); diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index 55492d36..25ea8af3 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -697,6 +697,7 @@ pub enum NamedColor { } impl NamedColor { + #[must_use] pub fn to_bright(self) -> Self { match self { NamedColor::Foreground => NamedColor::BrightForeground, @@ -721,6 +722,7 @@ impl NamedColor { } } + #[must_use] pub fn to_dim(self) -> Self { match self { NamedColor::Black => NamedColor::DimBlack, diff --git a/alacritty_terminal/src/index.rs b/alacritty_terminal/src/index.rs index 29b3eb15..e672c752 100644 --- a/alacritty_terminal/src/index.rs +++ b/alacritty_terminal/src/index.rs @@ -20,6 +20,7 @@ pub enum Direction { } impl Direction { + #[must_use] pub fn opposite(self) -> Self { match self { Side::Right => Side::Left, @@ -133,6 +134,7 @@ pub struct Line(pub i32); impl Line { /// Clamp a line to a grid boundary. + #[must_use] pub fn grid_clamp<D: Dimensions>(self, dimensions: &D, boundary: Boundary) -> Self { match boundary { Boundary::Cursor => max(Line(0), min(dimensions.bottommost_line(), self)), |