diff options
Diffstat (limited to 'alacritty')
-rw-r--r-- | alacritty/Cargo.toml | 4 | ||||
-rw-r--r-- | alacritty/build.rs | 19 | ||||
-rw-r--r-- | alacritty/src/cli.rs | 195 | ||||
-rw-r--r-- | alacritty/src/logging.rs | 4 | ||||
-rw-r--r-- | alacritty/src/main.rs | 9 |
5 files changed, 225 insertions, 6 deletions
diff --git a/alacritty/Cargo.toml b/alacritty/Cargo.toml index 0d388cb1..742492fe 100644 --- a/alacritty/Cargo.toml +++ b/alacritty/Cargo.toml @@ -10,11 +10,15 @@ edition = "2018" [dependencies] alacritty_terminal = { path = "../alacritty_terminal" } +clap = "2" log = "0.4" time = "0.1.40" env_logger = "0.6.0" crossbeam-channel = "0.3.8" +[build-dependencies] +rustc_tools_util = "0.1" + [target.'cfg(target_os = "macos")'.dependencies] dirs = "1.0.2" diff --git a/alacritty/build.rs b/alacritty/build.rs new file mode 100644 index 00000000..2a1ce9e0 --- /dev/null +++ b/alacritty/build.rs @@ -0,0 +1,19 @@ +// Copyright 2019 Joe Wilm, The Alacritty Project Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +fn main() { + let hash = rustc_tools_util::get_commit_hash() + .expect("couldn't get commit hash"); + println!("cargo:rustc-env=GIT_HASH={}", hash); +} diff --git a/alacritty/src/cli.rs b/alacritty/src/cli.rs new file mode 100644 index 00000000..90906218 --- /dev/null +++ b/alacritty/src/cli.rs @@ -0,0 +1,195 @@ +// Copyright 2019 Joe Wilm, The Alacritty Project Contributors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +use std::path::PathBuf; + +use ::log; +use clap::{crate_authors, crate_description, crate_name, crate_version, App, Arg}; + +use alacritty_terminal::config::{Options, Delta, Dimensions, Shell}; +use alacritty_terminal::index::{Column, Line}; +use alacritty_terminal::window::DEFAULT_NAME; + +/// Build `Options` from command line arguments. +pub fn options() -> Options { + let mut options = Options::default(); + + let version_string = format!("{} ({})", + crate_version!(), + env!("GIT_HASH")); + + let matches = App::new(crate_name!()) + .version(version_string.as_str()) + .author(crate_authors!("\n")) + .about(crate_description!()) + .arg(Arg::with_name("ref-test").long("ref-test").help("Generates ref test")) + .arg( + Arg::with_name("live-config-reload") + .long("live-config-reload") + .help("Enable automatic config reloading"), + ) + .arg( + Arg::with_name("no-live-config-reload") + .long("no-live-config-reload") + .help("Disable automatic config reloading") + .conflicts_with("live-config-reload"), + ) + .arg( + Arg::with_name("print-events") + .long("print-events") + .help("Print all events to stdout"), + ) + .arg( + Arg::with_name("persistent-logging") + .long("persistent-logging") + .help("Keep the log file after quitting Alacritty"), + ) + .arg( + Arg::with_name("dimensions") + .long("dimensions") + .short("d") + .value_names(&["columns", "lines"]) + .help( + "Defines the window dimensions. Falls back to size specified by window \ + manager if set to 0x0 [default: 0x0]", + ), + ) + .arg( + Arg::with_name("position") + .long("position") + .allow_hyphen_values(true) + .value_names(&["x-pos", "y-pos"]) + .help( + "Defines the window position. Falls back to position specified by window \ + manager if unset [default: unset]", + ), + ) + .arg( + Arg::with_name("title") + .long("title") + .short("t") + .takes_value(true) + .help(&format!("Defines the window title [default: {}]", DEFAULT_NAME)), + ) + .arg( + Arg::with_name("class") + .long("class") + .takes_value(true) + .help(&format!("Defines window class on Linux [default: {}]", DEFAULT_NAME)), + ) + .arg( + Arg::with_name("q") + .short("q") + .multiple(true) + .conflicts_with("v") + .help("Reduces the level of verbosity (the min level is -qq)"), + ) + .arg( + Arg::with_name("v") + .short("v") + .multiple(true) + .conflicts_with("q") + .help("Increases the level of verbosity (the max level is -vvv)"), + ) + .arg( + Arg::with_name("working-directory") + .long("working-directory") + .takes_value(true) + .help("Start the shell in the specified working directory"), + ) + .arg(Arg::with_name("config-file").long("config-file").takes_value(true).help( + "Specify alternative configuration file [default: \ + $XDG_CONFIG_HOME/alacritty/alacritty.yml]", + )) + .arg( + Arg::with_name("command") + .long("command") + .short("e") + .multiple(true) + .takes_value(true) + .min_values(1) + .allow_hyphen_values(true) + .help("Command and args to execute (must be last argument)"), + ) + .get_matches(); + + if matches.is_present("ref-test") { + options.ref_test = true; + } + + if matches.is_present("print-events") { + options.print_events = true; + } + + if matches.is_present("live-config-reload") { + options.live_config_reload = Some(true); + } else if matches.is_present("no-live-config-reload") { + options.live_config_reload = Some(false); + } + + if matches.is_present("persistent-logging") { + options.persistent_logging = true; + } + + if let Some(mut dimensions) = matches.values_of("dimensions") { + let width = dimensions.next().map(|w| w.parse().map(Column)); + let height = dimensions.next().map(|h| h.parse().map(Line)); + if let (Some(Ok(width)), Some(Ok(height))) = (width, height) { + options.dimensions = Some(Dimensions::new(width, height)); + } + } + + if let Some(mut position) = matches.values_of("position") { + let x = position.next().map(str::parse); + let y = position.next().map(str::parse); + if let (Some(Ok(x)), Some(Ok(y))) = (x, y) { + options.position = Some(Delta { x, y }); + } + } + + options.class = matches.value_of("class").map(ToOwned::to_owned); + options.title = matches.value_of("title").map(ToOwned::to_owned); + + match matches.occurrences_of("q") { + 0 => {}, + 1 => options.log_level = log::LevelFilter::Error, + 2 | _ => options.log_level = log::LevelFilter::Off, + } + + match matches.occurrences_of("v") { + 0 if !options.print_events => {}, + 0 | 1 => options.log_level = log::LevelFilter::Info, + 2 => options.log_level = log::LevelFilter::Debug, + 3 | _ => options.log_level = log::LevelFilter::Trace, + } + + if let Some(dir) = matches.value_of("working-directory") { + options.working_dir = Some(PathBuf::from(dir.to_string())); + } + + if let Some(path) = matches.value_of("config-file") { + options.config = Some(PathBuf::from(path.to_string())); + } + + if let Some(mut args) = matches.values_of("command") { + // The following unwrap is guaranteed to succeed. + // If 'command' exists it must also have a first item since + // Arg::min_values(1) is set. + let command = String::from(args.next().unwrap()); + let args = args.map(String::from).collect(); + options.command = Some(Shell::new_with_args(command, args)); + } + + options +} diff --git a/alacritty/src/logging.rs b/alacritty/src/logging.rs index 9c2041f0..0b67440d 100644 --- a/alacritty/src/logging.rs +++ b/alacritty/src/logging.rs @@ -29,14 +29,14 @@ use crossbeam_channel::Sender; use log::{self, Level}; use time; -use alacritty_terminal::cli; +use alacritty_terminal::config::Options; use alacritty_terminal::message_bar::Message; use alacritty_terminal::term::color; const ALACRITTY_LOG_ENV: &str = "ALACRITTY_LOG"; pub fn initialize( - options: &cli::Options, + options: &Options, message_tx: Sender<Message>, ) -> Result<Option<PathBuf>, log::SetLoggerError> { // Use env_logger if RUST_LOG environment variable is defined. Otherwise, diff --git a/alacritty/src/main.rs b/alacritty/src/main.rs index be512bee..24f2d6c9 100644 --- a/alacritty/src/main.rs +++ b/alacritty/src/main.rs @@ -42,7 +42,7 @@ use std::env; use std::os::unix::io::AsRawFd; use alacritty_terminal::clipboard::Clipboard; -use alacritty_terminal::config::{self, Config, Monitor}; +use alacritty_terminal::config::{self, Config, Options, Monitor}; use alacritty_terminal::display::Display; use alacritty_terminal::event_loop::{self, EventLoop, Msg}; #[cfg(target_os = "macos")] @@ -53,8 +53,9 @@ use alacritty_terminal::sync::FairMutex; use alacritty_terminal::term::Term; use alacritty_terminal::tty; use alacritty_terminal::util::fmt::Red; -use alacritty_terminal::{cli, die, event}; +use alacritty_terminal::{die, event}; +mod cli; mod logging; fn main() { @@ -69,7 +70,7 @@ fn main() { } // Load command line options - let options = cli::Options::load(); + let options = cli::options(); // Setup storage for message UI let message_buffer = MessageBuffer::new(); @@ -121,7 +122,7 @@ fn main() { /// config change monitor, and runs the main display loop. fn run( mut config: Config, - options: &cli::Options, + options: &Options, message_buffer: MessageBuffer, ) -> Result<(), Box<dyn Error>> { info!("Welcome to Alacritty"); |