summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCole Helbling <cole.e.helbling@gmail.com>2019-03-11 05:35:49 -0700
committerChristian Duerr <chrisduerr@users.noreply.github.com>2019-03-11 12:35:49 +0000
commite240da9ab3b819a8845ced1ab72d0a4239eac789 (patch)
tree9b31f117de9ed9e6455eff1d4604379d4ea461ac
parent0ec4bd28dadcf476baf6180af7cf93bea9214f19 (diff)
downloadalacritty-e240da9ab3b819a8845ced1ab72d0a4239eac789.tar.gz
alacritty-e240da9ab3b819a8845ced1ab72d0a4239eac789.zip
Add option for window position at startup
-rw-r--r--CHANGELOG.md2
-rw-r--r--alacritty-completions.bash2
-rw-r--r--alacritty-completions.fish5
-rw-r--r--alacritty-completions.zsh1
-rw-r--r--alacritty.man12
-rw-r--r--alacritty.yml8
-rw-r--r--src/cli.rs25
-rw-r--r--src/config/mod.rs17
-rw-r--r--src/display.rs8
-rw-r--r--src/window.rs9
10 files changed, 76 insertions, 13 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2ab59fa3..c9cdf14f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- MSI installer for Windows is now available
- New default key bindings Alt+Home, Alt+End, Alt+PageUp and Alt+PageDown
- Dynamic title support on Windows
+- Ability to specify starting position with the `--position` flag
+- New configuration field `window.position` allows specifying the starting position
### Fixed
diff --git a/alacritty-completions.bash b/alacritty-completions.bash
index 48c683e8..086e3cdc 100644
--- a/alacritty-completions.bash
+++ b/alacritty-completions.bash
@@ -11,7 +11,7 @@ _alacritty()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
prevprev="${COMP_WORDS[COMP_CWORD-2]}"
- opts="-h --help -V --version --live-config-reload --no-live-config-reload --persistent-logging --print-events -q -qq -v -vv -vvv --ref-test -e --command --config-file -d --dimensions -t --title --working-directory"
+ opts="-h --help -V --version --live-config-reload --no-live-config-reload --persistent-logging --print-events -q -qq -v -vv -vvv --ref-test -e --command --config-file -d --dimensions --position -t --title --working-directory"
# If `--command` or `-e` is used, stop completing
for i in "${!COMP_WORDS[@]}"; do
diff --git a/alacritty-completions.fish b/alacritty-completions.fish
index 6ffaef4b..5f605349 100644
--- a/alacritty-completions.fish
+++ b/alacritty-completions.fish
@@ -70,6 +70,11 @@ complete \
complete \
-c alacritty \
+ -l "position" \
+ -d "Window position <x-pos> <y-pos>"
+
+complete \
+ -c alacritty \
-s "e" \
-l "command" \
-d "Execute command (must be last arg)"
diff --git a/alacritty-completions.zsh b/alacritty-completions.zsh
index be7123a1..0d3df1c3 100644
--- a/alacritty-completions.zsh
+++ b/alacritty-completions.zsh
@@ -16,6 +16,7 @@ _alacritty() {
"--ref-test[Generates ref test]" \
"--config-file[Specify an alternative config file]:file:_files" \
"(-d --dimensions)"{-d,--dimensions}"[Window dimensions]:dimensions:_guard '<->' width: :_guard '<->' length" \
+ "--position[Window position]:position:_guard '<->' x-pos: :_guard '<->' y-pos" \
"--title[Defines the window title]:title:" \
"--working-directory[Start shell in specified directory]:directory:_dir_list" \
"(-e --command)"{-e,--command}"[Execute command (must be last arg)]:program: _command_names -e:*::program arguments: _normal"
diff --git a/alacritty.man b/alacritty.man
index de78f8d0..9a6e43d2 100644
--- a/alacritty.man
+++ b/alacritty.man
@@ -22,8 +22,9 @@ Disable automatic config reloading
.TP
\fB\-\-persistent\-logging\fR
Keep the log file after quitting Alacritty
-.HP
+.TP
\fB\-\-print\-events\fR
+Print all events to stdout
.TP
\fB\-q\fR
Reduces the level of verbosity (the min level is \fB\-qq\fR)
@@ -43,15 +44,16 @@ Defines the window class on X11 [default: Alacritty]
.TP
\fB\-e\fR, \fB\-\-command\fR <command>...
Command and args to execute (must be last argument)
-.HP
+.TP
\fB\-\-config\-file\fR <config\-file>
-.IP
Specify alternative configuration file [default: $XDG_CONFIG_HOME/alacritty/alacritty.yml]
-.HP
+.TP
\fB\-d\fR, \fB\-\-dimensions\fR <columns> <lines>
-.IP
Defines the window dimensions. Falls back to size specified by window manager if set to 0x0 [default: 0x0]
.TP
+\fB\-\-position\fR <x-pos> <y-pos>
+Defines the window position. Falls back to position specified by window manager if unset [default: unset]
+.TP
\fB\-t\fR, \fB\-\-title\fR <title>
Defines the window title [default: Alacritty]
.TP
diff --git a/alacritty.yml b/alacritty.yml
index e5a42196..6135b318 100644
--- a/alacritty.yml
+++ b/alacritty.yml
@@ -21,6 +21,14 @@ window:
columns: 0
lines: 0
+ # Window position (changes require restart)
+ #
+ # Specified in number of pixels.
+ # If the position is not set, the window manager will handle the placement.
+ #position:
+ # x: 0
+ # y: 0
+
# Window padding (changes require restart)
#
# Blank space added around the window in pixels. This padding is scaled
diff --git a/src/cli.rs b/src/cli.rs
index 63faa5b5..12d3ade0 100644
--- a/src/cli.rs
+++ b/src/cli.rs
@@ -15,7 +15,7 @@ use ::log;
use clap::{Arg, App, crate_name, crate_version, crate_authors, crate_description};
use crate::index::{Line, Column};
-use crate::config::{Dimensions, Shell};
+use crate::config::{Dimensions, Delta, Shell};
use crate::window::{DEFAULT_NAME};
use std::path::{Path, PathBuf};
use std::borrow::Cow;
@@ -26,6 +26,7 @@ pub struct Options {
pub print_events: bool,
pub ref_test: bool,
pub dimensions: Option<Dimensions>,
+ pub position: Option<Delta<i32>>,
pub title: Option<String>,
pub class: Option<String>,
pub log_level: log::LevelFilter,
@@ -42,6 +43,7 @@ impl Default for Options {
print_events: false,
ref_test: false,
dimensions: None,
+ position: None,
title: None,
class: None,
log_level: log::LevelFilter::Warn,
@@ -73,7 +75,8 @@ impl Options {
.help("Disable automatic config reloading")
.conflicts_with("live-config-reload"))
.arg(Arg::with_name("print-events")
- .long("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"))
@@ -83,6 +86,12 @@ impl Options {
.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")
@@ -147,6 +156,14 @@ impl Options {
}
}
+ if let Some(mut position) = matches.values_of("position") {
+ let x = position.next().map(|x| x.parse::<i32>());
+ let y = position.next().map(|y| y.parse::<i32>());
+ if let (Some(Ok(x)), Some(Ok(y))) = (x, y) {
+ options.position = Some(Delta { x, y });
+ }
+ }
+
options.class = matches.value_of("class").map(|c| c.to_owned());
options.title = matches.value_of("title").map(|t| t.to_owned());
@@ -187,6 +204,10 @@ impl Options {
self.dimensions
}
+ pub fn position(&self) -> Option<Delta<i32>> {
+ self.position
+ }
+
pub fn command(&self) -> Option<&Shell<'_>> {
self.command.as_ref()
}
diff --git a/src/config/mod.rs b/src/config/mod.rs
index 3f0cd0bb..4b9e1f8e 100644
--- a/src/config/mod.rs
+++ b/src/config/mod.rs
@@ -414,6 +414,10 @@ pub struct WindowConfig {
#[serde(default, deserialize_with = "failure_default")]
dimensions: Dimensions,
+ /// Initial position
+ #[serde(default, deserialize_with = "failure_default")]
+ position: Option<Delta<i32>>,
+
/// Pixel padding
#[serde(deserialize_with = "deserialize_padding")]
padding: Delta<u8>,
@@ -435,6 +439,7 @@ impl Default for WindowConfig {
fn default() -> Self {
WindowConfig{
dimensions: Default::default(),
+ position: Default::default(),
padding: default_padding(),
decorations: Default::default(),
dynamic_padding: Default::default(),
@@ -476,10 +481,6 @@ impl WindowConfig {
/// Top-level config type
#[derive(Debug, PartialEq, Deserialize)]
pub struct Config {
- /// Initial dimensions
- #[serde(default, deserialize_with = "failure_default")]
- dimensions: Option<Dimensions>,
-
/// Pixel padding
#[serde(default, deserialize_with = "failure_default")]
padding: Option<Delta<u8>>,
@@ -582,6 +583,9 @@ pub struct Config {
// TODO: DEPRECATED
unfocused_hollow_cursor: Option<bool>,
+
+ // TODO: DEPRECATED
+ dimensions: Option<Dimensions>,
}
impl Default for Config {
@@ -1756,6 +1760,11 @@ impl Config {
self.dimensions.unwrap_or(self.window.dimensions)
}
+ #[inline]
+ pub fn position(&self) -> Option<Delta<i32>> {
+ self.window.position
+ }
+
/// Get window config
#[inline]
pub fn window(&self) -> &WindowConfig {
diff --git a/src/display.rs b/src/display.rs
index 4873e02a..8266e655 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -140,6 +140,14 @@ impl Display {
// Create the window where Alacritty will be displayed
let mut window = Window::new(&options, config.window())?;
+ // TODO: replace `set_position` with `with_position` once available
+ // Upstream issue: https://github.com/tomaka/winit/issues/806
+ // Set window position early so it doesn't "teleport"
+ let position = options.position().or_else(|| config.position());
+ if let Some(position) = position {
+ window.set_position(position.x, position.y);
+ }
+
let dpr = window.hidpi_factor();
info!("Device pixel ratio: {}", dpr);
diff --git a/src/window.rs b/src/window.rs
index cceffcab..54f0b887 100644
--- a/src/window.rs
+++ b/src/window.rs
@@ -24,7 +24,7 @@ use glutin::{
self, ContextBuilder, ControlFlow, Event, EventsLoop,
MouseCursor as GlutinMouseCursor, WindowBuilder,
};
-use glutin::dpi::{LogicalPosition, LogicalSize, PhysicalSize};
+use glutin::dpi::{LogicalPosition, LogicalSize, PhysicalPosition, PhysicalSize};
use crate::cli::Options;
use crate::config::{Decorations, WindowConfig};
@@ -182,6 +182,13 @@ impl Window {
self.window.set_inner_size(size);
}
+ // TODO: use `with_position` once available
+ // Upstream issue: https://github.com/tomaka/winit/issues/806
+ pub fn set_position(&mut self, x: i32, y: i32) {
+ let logical = PhysicalPosition::from((x, y)).to_logical(self.window.get_hidpi_factor());
+ self.window.set_position(logical);
+ }
+
#[inline]
pub fn hidpi_factor(&self) -> f64 {
self.window.get_hidpi_factor()