summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorii41 <23465321+ii41@users.noreply.github.com>2020-09-27 15:36:08 -0700
committerGitHub <noreply@github.com>2020-09-27 22:36:08 +0000
commita754d06b44139b85e8b34a71ece4477cb1caa85e (patch)
tree1733f8d17101947b6df5e1ad15b3fd64cf1db9a0
parente9c0034f4d3ee003149fe5454942bea7ff3d98be (diff)
downloadalacritty-a754d06b44139b85e8b34a71ece4477cb1caa85e.tar.gz
alacritty-a754d06b44139b85e8b34a71ece4477cb1caa85e.zip
Add support for single line terminals
This changes the minimum terminal dimensions from 2 lines and 2 columns, to 1 line and 2 columns. This also reworks the `SizeInfo` to store the number of columns and lines and consistently has only the terminal lines/columns stored, instead of including the message bar and search in some places of the Alacritty renderer/input. These new changes also make it easy to properly start the selection scrolling as soon as the mouse is over the message bar, instead of waiting until it is beyond it. Fixes #4207. Co-authored-by: Christian Duerr <contact@christianduerr.com>
-rw-r--r--CHANGELOG.md2
-rw-r--r--alacritty.yml5
-rw-r--r--alacritty/src/cli.rs13
-rw-r--r--alacritty/src/config/window.rs70
-rw-r--r--alacritty/src/display.rs230
-rw-r--r--alacritty/src/event.rs37
-rw-r--r--alacritty/src/input.rs103
-rw-r--r--alacritty/src/main.rs6
-rw-r--r--alacritty/src/message_bar.rs107
-rw-r--r--alacritty/src/renderer/mod.rs70
-rw-r--r--alacritty/src/renderer/rects.rs15
-rw-r--r--alacritty/src/window.rs18
-rw-r--r--alacritty_terminal/src/ansi.rs2
-rw-r--r--alacritty_terminal/src/selection.rs14
-rw-r--r--alacritty_terminal/src/term/mod.rs279
-rw-r--r--alacritty_terminal/src/tty/unix.rs6
-rw-r--r--alacritty_terminal/src/tty/windows/conpty.rs8
-rw-r--r--alacritty_terminal/src/tty/windows/winpty.rs6
-rw-r--r--alacritty_terminal/src/vi_mode.rs10
-rw-r--r--alacritty_terminal/tests/ref/alt_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/clear_underline/size.json2
-rw-r--r--alacritty_terminal/tests/ref/colored_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/csi_rep/size.json2
-rw-r--r--alacritty_terminal/tests/ref/decaln_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/deccolm_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/delete_chars_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/delete_lines/size.json2
-rw-r--r--alacritty_terminal/tests/ref/erase_chars_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/fish_cc/size.json2
-rw-r--r--alacritty_terminal/tests/ref/grid_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/history/size.json2
-rw-r--r--alacritty_terminal/tests/ref/indexed_256_colors/size.json2
-rw-r--r--alacritty_terminal/tests/ref/insert_blank_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/issue_855/size.json2
-rw-r--r--alacritty_terminal/tests/ref/ll/size.json2
-rw-r--r--alacritty_terminal/tests/ref/newline_with_cursor_beyond_scroll_region/size.json2
-rw-r--r--alacritty_terminal/tests/ref/region_scroll_down/size.json2
-rw-r--r--alacritty_terminal/tests/ref/row_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/saved_cursor/size.json2
-rw-r--r--alacritty_terminal/tests/ref/saved_cursor_alt/size.json2
-rw-r--r--alacritty_terminal/tests/ref/scroll_up_reset/size.json2
-rw-r--r--alacritty_terminal/tests/ref/selective_erasure/size.json2
-rw-r--r--alacritty_terminal/tests/ref/sgr/size.json2
-rw-r--r--alacritty_terminal/tests/ref/tab_rendering/size.json2
-rw-r--r--alacritty_terminal/tests/ref/tmux_git_log/size.json2
-rw-r--r--alacritty_terminal/tests/ref/tmux_htop/size.json2
-rw-r--r--alacritty_terminal/tests/ref/underline/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vim_large_window_scroll/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vim_simple_edit/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vttest_cursor_movement_1/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vttest_insert/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vttest_origin_mode_1/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vttest_origin_mode_2/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vttest_scroll/size.json2
-rw-r--r--alacritty_terminal/tests/ref/vttest_tab_clear_set/size.json2
-rw-r--r--alacritty_terminal/tests/ref/wrapline_alt_toggle/size.json2
-rw-r--r--alacritty_terminal/tests/ref/zerowidth/size.json2
-rw-r--r--alacritty_terminal/tests/ref/zsh_tab_completion/size.json2
59 files changed, 484 insertions, 597 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0688a7cf..a7f130a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Configuration file option for sourcing other files (`import`)
- CLI parameter `--option`/`-o` to override any configuration field
- Escape sequences to report text area size in pixels (`CSI 14 t`) and in characters (`CSI 18 t`)
+- Support for single line terminals dimensions
### Changed
@@ -45,6 +46,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Crash due to fd leak on Wayland
- IME window position with fullwidth characters in the search bar
- Selection expanding over 2 characters when scrolled in history with fullwidth characters in use
+- Selection scrolling not starting when mouse is over the message bar
## 0.5.0
diff --git a/alacritty.yml b/alacritty.yml
index ac4477fc..fd13c2b9 100644
--- a/alacritty.yml
+++ b/alacritty.yml
@@ -23,8 +23,9 @@
#window:
# Window dimensions (changes require restart)
#
- # Specified in number of columns/lines, not pixels.
- # If both are `0`, this setting is ignored.
+ # Number of lines/columns (not pixels) in the terminal. The number of columns
+ # must be at least `2`, while using a value of `0` for columns and lines will
+ # fall back to the window manager's recommended size.
#dimensions:
# columns: 0
# lines: 0
diff --git a/alacritty/src/cli.rs b/alacritty/src/cli.rs
index 047c8d2e..6303d081 100644
--- a/alacritty/src/cli.rs
+++ b/alacritty/src/cli.rs
@@ -205,10 +205,10 @@ impl Options {
}
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));
+ let columns = dimensions.next().map(|columns| columns.parse().map(Column));
+ let lines = dimensions.next().map(|lines| lines.parse().map(Line));
+ if let (Some(Ok(columns)), Some(Ok(lines))) = (columns, lines) {
+ options.dimensions = Some(Dimensions { columns, lines });
}
}
@@ -309,7 +309,10 @@ impl Options {
let dynamic_title = config.ui_config.dynamic_title() && self.title.is_none();
config.ui_config.set_dynamic_title(dynamic_title);
- replace_if_some(&mut config.ui_config.window.dimensions, self.dimensions);
+ if let Some(dimensions) = self.dimensions {
+ config.ui_config.window.set_dimensions(dimensions);
+ }
+
replace_if_some(&mut config.ui_config.window.title, self.title.clone());
replace_if_some(&mut config.ui_config.window.class.instance, self.class_instance.clone());
replace_if_some(&mut config.ui_config.window.class.general, self.class_general.clone());
diff --git a/alacritty/src/config/window.rs b/alacritty/src/config/window.rs
index f866e180..d2e5da68 100644
--- a/alacritty/src/config/window.rs
+++ b/alacritty/src/config/window.rs
@@ -15,26 +15,14 @@ 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")]
pub startup_mode: StartupMode,
@@ -55,9 +43,21 @@ pub struct WindowConfig {
#[serde(deserialize_with = "option_explicit_none")]
pub gtk_theme_variant: Option<String>,
+ /// Spread out additional padding evenly.
+ #[serde(deserialize_with = "failure_default")]
+ pub dynamic_padding: bool,
+
+ /// Pixel padding.
+ #[serde(deserialize_with = "failure_default")]
+ padding: Delta<u8>,
+
/// Use dynamic title.
#[serde(default, deserialize_with = "failure_default")]
dynamic_title: DefaultTrueBool,
+
+ /// Initial dimensions.
+ #[serde(deserialize_with = "failure_default")]
+ dimensions: Dimensions,
}
pub fn default_title() -> String {
@@ -74,6 +74,30 @@ impl WindowConfig {
pub fn set_dynamic_title(&mut self, dynamic_title: bool) {
self.dynamic_title.0 = dynamic_title;
}
+
+ #[inline]
+ pub fn set_dimensions(&mut self, dimensions: Dimensions) {
+ self.dimensions = dimensions;
+ }
+
+ #[inline]
+ pub fn dimensions(&self) -> Option<Dimensions> {
+ if self.dimensions.columns.0 != 0
+ && self.dimensions.lines.0 != 0
+ && self.startup_mode != StartupMode::Maximized
+ {
+ Some(self.dimensions)
+ } else {
+ None
+ }
+ }
+
+ #[inline]
+ pub fn padding(&self, dpr: f64) -> (f32, f32) {
+ let padding_x = (f32::from(self.padding.x) * dpr as f32).floor();
+ let padding_y = (f32::from(self.padding.y) * dpr as f32).floor();
+ (padding_x, padding_y)
+ }
}
impl Default for WindowConfig {
@@ -137,29 +161,11 @@ impl Default for Decorations {
pub struct Dimensions {
/// Window width in character columns.
#[serde(deserialize_with = "failure_default")]
- columns: Column,
+ pub 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
- }
+ pub lines: Line,
}
/// Window class hint.
diff --git a/alacritty/src/display.rs b/alacritty/src/display.rs
index ca5bfe34..0b493936 100644
--- a/alacritty/src/display.rs
+++ b/alacritty/src/display.rs
@@ -25,12 +25,13 @@ use crossfont::set_font_smoothing;
use crossfont::{self, Rasterize, Rasterizer};
use alacritty_terminal::event::{EventListener, OnResize};
-use alacritty_terminal::index::{Column, Direction, Line, Point};
+use alacritty_terminal::index::{Column, Direction, Point};
use alacritty_terminal::selection::Selection;
use alacritty_terminal::term::{RenderableCell, SizeInfo, Term, TermMode};
+use alacritty_terminal::term::{MIN_COLS, MIN_SCREEN_LINES};
use crate::config::font::Font;
-use crate::config::window::StartupMode;
+use crate::config::window::{Dimensions, StartupMode};
use crate::config::Config;
use crate::event::{Mouse, SearchState};
use crate::message_bar::{MessageBuffer, MessageType};
@@ -109,8 +110,8 @@ pub struct DisplayUpdate {
pub dirty: bool,
dimensions: Option<PhysicalSize<u32>>,
- font: Option<Font>,
cursor_dirty: bool,
+ font: Option<Font>,
}
impl DisplayUpdate {
@@ -171,16 +172,15 @@ impl Display {
let metrics = GlyphCache::static_metrics(config.ui_config.font.clone(), estimated_dpr)?;
let (cell_width, cell_height) = compute_cell_size(config, &metrics);
- let dimensions = GlyphCache::calculate_dimensions(
- &config.ui_config.window,
- estimated_dpr,
- cell_width,
- cell_height,
- );
+ // Guess the target window size if the user has specified the number of lines/columns.
+ let dimensions = config.ui_config.window.dimensions();
+ let estimated_size = dimensions.map(|dimensions| {
+ window_size(config, dimensions, cell_width, cell_height, estimated_dpr)
+ });
debug!("Estimated DPR: {}", estimated_dpr);
- debug!("Estimated Cell Size: {} x {}", cell_width, cell_height);
- debug!("Estimated Dimensions: {:?}", dimensions);
+ debug!("Estimated window size: {:?}", estimated_size);
+ debug!("Estimated cell size: {} x {}", cell_width, cell_height);
#[cfg(not(any(target_os = "macos", windows)))]
let mut wayland_event_queue = None;
@@ -192,20 +192,16 @@ impl Display {
wayland_event_queue = Some(display.create_event_queue());
}
- // Create the window where Alacritty will be displayed.
- let size = dimensions.map(|(width, height)| PhysicalSize::new(width, height));
-
- // Spawn window.
+ // Spawn the Alacritty window.
let mut window = Window::new(
event_loop,
&config,
- size,
+ estimated_size,
#[cfg(not(any(target_os = "macos", windows)))]
wayland_event_queue.as_ref(),
)?;
- let dpr = window.scale_factor();
- info!("Device pixel ratio: {}", dpr);
+ info!("Device pixel ratio: {}", window.dpr);
// get window properties for initializing the other subsystems.
let viewport_size = window.inner_size();
@@ -214,43 +210,33 @@ impl Display {
let mut renderer = QuadRenderer::new()?;
let (glyph_cache, cell_width, cell_height) =
- Self::new_glyph_cache(dpr, &mut renderer, config)?;
-
- let padding = config.ui_config.window.padding;
- let mut padding_x = f32::from(padding.x) * dpr as f32;
- let mut padding_y = f32::from(padding.y) * dpr as f32;
+ Self::new_glyph_cache(window.dpr, &mut renderer, config)?;
- if let Some((width, height)) =
- GlyphCache::calculate_dimensions(&config.ui_config.window, dpr, cell_width, cell_height)
- {
- let PhysicalSize { width: w, height: h } = window.inner_size();
- if w == width && h == height {
+ if let Some(dimensions) = dimensions {
+ if (estimated_dpr - window.dpr).abs() < f64::EPSILON {
info!("Estimated DPR correctly, skipping resize");
} else {
- window.set_inner_size(PhysicalSize::new(width, height));
+ // Resize the window again if the DPR was not estimated correctly.
+ let size = window_size(config, dimensions, cell_width, cell_height, window.dpr);
+ window.set_inner_size(size);
}
- } else if config.ui_config.window.dynamic_padding {
- // Make sure additional padding is spread evenly.
- padding_x = dynamic_padding(padding_x, viewport_size.width as f32, cell_width);
- padding_y = dynamic_padding(padding_y, viewport_size.height as f32, cell_height);
}
- padding_x = padding_x.floor();
- padding_y = padding_y.floor();
-
- info!("Cell Size: {} x {}", cell_width, cell_height);
- info!("Padding: {} x {}", padding_x, padding_y);
+ let padding = config.ui_config.window.padding(window.dpr);
// Create new size with at least one column and row.
- let size_info = SizeInfo {
- dpr,
- width: (viewport_size.width as f32).max(cell_width + 2. * padding_x),
- height: (viewport_size.height as f32).max(cell_height + 2. * padding_y),
+ let size_info = SizeInfo::new(
+ viewport_size.width as f32,
+ viewport_size.height as f32,
cell_width,
cell_height,
- padding_x,
- padding_y,
- };
+ padding.0,
+ padding.1,
+ config.ui_config.window.dynamic_padding && dimensions.is_none(),
+ );
+
+ info!("Cell size: {} x {}", cell_width, cell_height);
+ info!("Padding: {} x {}", size_info.padding_x(), size_info.padding_y());
// Update OpenGL projection.
renderer.resize(&size_info);
@@ -345,20 +331,18 @@ impl Display {
}
/// Update font size and cell dimensions.
- fn update_glyph_cache(&mut self, config: &Config, font: &Font) {
- let size_info = &mut self.size_info;
+ ///
+ /// This will return a tuple of the cell width and height.
+ fn update_glyph_cache(&mut self, config: &Config, font: &Font) -> (f32, f32) {
let cache = &mut self.glyph_cache;
+ let dpr = self.window.dpr;
self.renderer.with_loader(|mut api| {
- let _ = cache.update_font_size(font, size_info.dpr, &mut api);
+ let _ = cache.update_font_size(font, dpr, &mut api);
});
- // Update cell size.
- let (cell_width, cell_height) = compute_cell_size(config, &self.glyph_cache.font_metrics());
- size_info.cell_width = cell_width;
- size_info.cell_height = cell_height;
-
- info!("Cell Size: {} x {}", cell_width, cell_height);
+ // Compute new cell sizes.
+ compute_cell_size(config, &self.glyph_cache.font_metrics())
}
/// Clear glyph cache.
@@ -381,63 +365,58 @@ impl Display {
) where
T: EventListener,
{
+ let (mut cell_width, mut cell_height) =
+ (self.size_info.cell_width(), self.size_info.cell_height());
+
// Update font size and cell dimensions.
if let Some(font) = update_pending.font() {
- self.update_glyph_cache(config, font);
+ let cell_dimensions = self.update_glyph_cache(config, font);
+ cell_width = cell_dimensions.0;
+ cell_height = cell_dimensions.1;
+
+ info!("Cell size: {} x {}", cell_width, cell_height);
} else if update_pending.cursor_dirty() {
self.clear_glyph_cache();
}
- let cell_width = self.size_info.cell_width;
- let cell_height = self.size_info.cell_height;
-
- // Recalculate padding.
- let padding = config.ui_config.window.padding;
- let mut padding_x = f32::from(padding.x) * self.size_info.dpr as f32;
- let mut padding_y = f32::from(padding.y) * self.size_info.dpr as f32;
-
- // Update the window dimensions.
- if let Some(size) = update_pending.dimensions() {
- // Ensure we have at least one column and row.
- self.size_info.width = (size.width as f32).max(cell_width + 2. * padding_x);
- self.size_info.height = (size.height as f32).max(cell_height + 2. * padding_y);
+ let (mut width, mut height) = (self.size_info.width(), self.size_info.height());
+ if let Some(dimensions) = update_pending.dimensions() {
+ width = dimensions.width as f32;
+ height = dimensions.height as f32;
}
- // Distribute excess padding equally on all sides.
- if config.ui_config.window.dynamic_padding {
- padding_x = dynamic_padding(padding_x, self.size_info.width, cell_width);
- padding_y = dynamic_padding(padding_y, self.size_info.height, cell_height);
- }
+ let padding = config.ui_config.window.padding(self.window.dpr);
- self.size_info.padding_x = padding_x.floor() as f32;
- self.size_info.padding_y = padding_y.floor() as f32;
-
- let mut pty_size = self.size_info;
-
- // Subtract message bar lines from pty size.
- if let Some(message) = message_buffer.message() {
- let lines = message.text(&self.size_info).len();
- pty_size.height -= pty_size.cell_height * lines as f32;
- }
+ self.size_info = SizeInfo::new(
+ width,
+ height,
+ cell_width,
+ cell_height,
+ padding.0,
+ padding.1,
+ config.ui_config.window.dynamic_padding,
+ );
- // Add an extra line for the current search regex.
- if search_active {
- pty_size.height -= pty_size.cell_height;
- }
+ // Update number of column/lines in the viewport.
+ let message_bar_lines =
+ message_buffer.message().map(|m| m.text(&self.size_info).len()).unwrap_or(0);
+ let search_lines = if search_active { 1 } else { 0 };
+ self.size_info.reserve_lines(message_bar_lines + search_lines);
// Resize PTY.
- pty_resize_handle.on_resize(&pty_size);
+ pty_resize_handle.on_resize(&self.size_info);
// Resize terminal.
- terminal.resize(pty_size);
+ terminal.resize(self.size_info);
// Resize renderer.
- let physical = PhysicalSize::new(self.size_info.width as u32, self.size_info.height as u32);
+ let physical =
+ PhysicalSize::new(self.size_info.width() as u32, self.size_info.height() as u32);
self.window.resize(physical);
self.renderer.resize(&self.size_info);
- info!("Padding: {} x {}", self.size_info.padding_x, self.size_info.padding_y);
- info!("Width: {}, Height: {}", self.size_info.width, self.size_info.height);
+ info!("Padding: {} x {}", self.size_info.padding_x(), self.size_info.padding_y());
+ info!("Width: {}, Height: {}", self.size_info.width(), self.size_info.height());
}
/// Draw the screen.
@@ -533,22 +512,21 @@ impl Display {
let visual_bell_rect = RenderRect::new(
0.,
0.,
- size_info.width,
- size_info.height,
+ size_info.width(),
+ size_info.height(),
config.bell().color,
visual_bell_intensity as f32,
);
rects.push(visual_bell_rect);
}
- let mut message_bar_lines = 0;
if let Some(message) = message_buffer.message() {
+ let search_offset = if search_state.regex().is_some() { 1 } else { 0 };
let text = message.text(&size_info);
- message_bar_lines = text.len();
// Create a new rectangle for the background.
- let start_line = size_info.lines().0 - message_bar_lines;
- let y = size_info.cell_height.mul_add(start_line as f32, size_info.padding_y);
+ let start_line = size_info.screen_lines() + search_offset;
+ let y = size_info.cell_height().mul_add(start_line.0 as f32, size_info.padding_y());
let color = match message.ty() {
MessageType::Error => config.colors.normal().red,
@@ -556,7 +534,7 @@ impl Display {
};
let message_bar_rect =
- RenderRect::new(0., y, size_info.width, size_info.height - y, color, 1.);
+ RenderRect::new(0., y, size_info.width(), size_info.height() - y, color, 1.);
// Push message_bar in the end, so it'll be above all other content.
rects.push(message_bar_rect);
@@ -566,15 +544,9 @@ impl Display {
// Relay messages to the user.
let fg = config.colors.primary.background;
- for (i, message_text) in text.iter().rev().enumerate() {
+ for (i, message_text) in text.iter().enumerate() {
self.renderer.with_api(&config.ui_config, config.cursor, &size_info, |mut api| {
- api.render_string(
- glyph_cache,
- Line(size_info.lines().saturating_sub(i + 1)),
- &message_text,
- fg,
- None,
- );
+ api.render_string(glyph_cache, start_line + i, &message_text, fg, None);
});
}
} else {
@@ -595,10 +567,10 @@ impl Display {
let search_text = Self::format_search(&size_info, regex, search_label);
// Render the search bar.
- self.draw_search(config, &size_info, message_bar_lines, &search_text);
+ self.draw_search(config, &size_info, &search_text);
// Compute IME position.
- Point::new(size_info.lines() - 1, Column(search_text.chars().count() - 1))
+ Point::new(size_info.screen_lines() + 1, Column(search_text.chars().count() - 1))
},
None => cursor_point,
};
@@ -656,13 +628,7 @@ impl Display {
}
/// Draw current search regex.
- fn draw_search(
- &mut self,
- config: &Config,
- size_info: &SizeInfo,
- message_bar_lines: usize,
- text: &str,
- ) {
+ fn draw_search(&mut self, config: &Config, size_info: &SizeInfo, text: &str) {
let glyph_cache = &mut self.glyph_cache;
let num_cols = size_info.cols().0;
@@ -671,9 +637,8 @@ impl Display {
let fg = config.colors.search_bar_foreground();
let bg = config.colors.search_bar_background();
- let line = size_info.lines() - message_bar_lines - 1;
self.renderer.with_api(&config.ui_config, config.cursor, &size_info, |mut api| {
- api.render_string(glyph_cache, line, &text, fg, Some(bg));
+ api.render_string(glyph_cache, size_info.screen_lines(), &text, fg, Some(bg));
});
}
@@ -689,7 +654,7 @@ impl Display {
let bg = config.colors.normal().red;
self.renderer.with_api(&config.ui_config, config.cursor, &size_info, |mut api| {
- api.render_string(glyph_cache, size_info.lines() - 2, &timing[..], fg, Some(bg));
+ api.render_string(glyph_cache, size_info.screen_lines() - 2, &timing[..], fg, Some(bg));
});
}
@@ -714,13 +679,9 @@ impl Display {
}
}
-/// Calculate padding to spread it evenly around the terminal content.
-#[inline]
-fn dynamic_padding(padding: f32, dimension: f32, cell_dimension: f32) -> f32 {
- padding + ((dimension - 2. * padding) % cell_dimension) / 2.
-}
-
/// Calculate the cell dimensions based on font metrics.
+///
+/// This will return a tuple of the cell width and height.
#[inline]
fn compute_cell_size(config: &Config, metrics: &crossfont::Metrics) -> (f32, f32) {
let offset_x = f64::from(config.ui_config.font.offset.x);
@@ -730,3 +691,22 @@ fn compute_cell_size(config: &Config, metrics: &crossfont::Metrics) -> (f32, f32
((metrics.line_height + offset_y) as f32).floor().max(1.),
)
}
+
+/// Calculate the size of the window given padding, terminal dimensions and cell size.
+fn window_size(
+ config: &Config,
+ dimensions: Dimensions,
+ cell_width: f32,
+ cell_height: f32,
+ dpr: f64,
+) -> PhysicalSize<u32> {
+ let padding = config.ui_config.window.padding(dpr);
+
+ let grid_width = cell_width * dimensions.columns.0.max(MIN_COLS) as f32;
+ let grid_height = cell_height * dimensions.lines.0.max(MIN_SCREEN_LINES) as f32;
+
+ let width = (padding.0).mul_add(2., grid_width).floor();
+ let height = (padding.1).mul_add(2., grid_height).floor();
+
+ PhysicalSize::new(width as u32, height as u32)
+}
diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs
index e81dc0f9..e45795dd 100644
--- a/alacritty/src/event.rs
+++ b/alacritty/src/event.rs
@@ -410,14 +410,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon
self.goto_match(None);
}
- // Move vi cursor down if resize will pull content from history.
- if self.terminal.history_size() != 0 && self.terminal.grid().display_offset() == 0 {
- self.terminal.vi_mode_cursor.point.line += 1;
- }
-
- self.display_update_pending.dirty = true;
- self.search_state.regex = None;
- self.terminal.dirty = true;
+ self.exit_search();
}
#[inline]
@@ -429,14 +422,7 @@ impl<'a, N: Notify + 'a, T: EventListener> input::ActionContext<T> for ActionCon
self.search_reset_state();
}
- // Move vi cursor down if resize will pull from history.
- if self.terminal.history_size() != 0 && self.terminal.grid().display_offset() == 0 {
- self.terminal.vi_mode_cursor.point.line += 1;
- }
-
- self.display_update_pending.dirty = true;
- self.search_state.regex = None;
- self.terminal.dirty = true;
+ self.exit_search();
}
#[inline]
@@ -628,6 +614,21 @@ impl<'a, N: Notify + 'a, T: EventListener> ActionContext<'a, N, T> {
self.search_state.regex = Some(regex);
}
+ /// Close the search bar.
+ fn exit_search(&mut self) {
+ // Move vi cursor down if resize will pull content from history.
+ if self.terminal.history_size() != 0
+ && self.terminal.grid().display_offset() == 0
+ && self.terminal.screen_lines() > self.terminal.vi_mode_cursor.point.line + 1
+ {
+ self.terminal.vi_mode_cursor.point.line += 1;
+ }
+
+ self.display_update_pending.dirty = true;
+ self.search_state.regex = None;
+ self.terminal.dirty = true;
+ }
+
/// Get the absolute position of the search origin.
///
/// This takes the relative motion of the viewport since the start of the search into account.
@@ -914,7 +915,7 @@ impl<N: Notify + OnResize> Processor<N> {
// Resize to event's dimensions, since no resize event is emitted on Wayland.
display_update_pending.set_dimensions(PhysicalSize::new(width, height));
- processor.ctx.size_info.dpr = scale_factor;
+ processor.ctx.window.dpr = scale_factor;
processor.ctx.terminal.dirty = true;
},
Event::Message(message) => {
@@ -1098,7 +1099,7 @@ impl<N: Notify + OnResize> Processor<N> {
// Update display if padding options were changed.
let window_config = &processor.ctx.config.ui_config.window;
- if window_config.padding != config.ui_config.window.padding
+ if window_config.padding(1.) != config.ui_config.window.padding(1.)
|| window_config.dynamic_padding != config.ui_config.window.dynamic_padding
{
processor.ctx.display_update_pending.dirty = true;
diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs
index 351e164c..9c75753a 100644
--- a/alacritty/src/input.rs
+++ b/alacritty/src/input.rs
@@ -371,8 +371,8 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
self.update_selection_scrolling(y);
}
- let x = min(max(x, 0), size_info.width as i32 - 1) as usize;
- let y = min(max(y, 0), size_info.height as i32 - 1) as usize;
+ let x = min(max(x, 0), size_info.width() as i32 - 1) as usize;
+ let y = min(max(y, 0), size_info.height() as i32 - 1) as usize;
self.ctx.mouse_mut().x = x;
self.ctx.mouse_mut().y = y;
@@ -384,6 +384,11 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
let cell_changed =
point.line != self.ctx.mouse().line || point.col != self.ctx.mouse().column;
+ // Update mouse state and check for URL change.
+ let mouse_state = self.mouse_state();
+ self.update_url_state(&mouse_state);
+ self.ctx.window_mut().set_mouse_cursor(mouse_state.into());
+
// If the mouse hasn't changed cells, do nothing.
if !cell_changed
&& self.ctx.mouse().cell_side == cell_side
@@ -400,11 +405,6 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
// Don't launch URLs if mouse has moved.
self.ctx.mouse_mut().block_url_launcher = true;
- // Update mouse state and check for URL change.
- let mouse_state = self.mouse_state();
- self.update_url_state(&mouse_state);
- self.ctx.window_mut().set_mouse_cursor(mouse_state.into());
-
if (lmb_pressed || rmb_pressed)
&& (self.ctx.modifiers().shift() || !self.ctx.mouse_mode())
&& !search_active
@@ -431,12 +431,13 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
let size_info = self.ctx.size_info();
let x = self.ctx.mouse().x;
- let cell_x = x.saturating_sub(size_info.padding_x as usize) % size_info.cell_width as usize;
- let half_cell_width = (size_info.cell_width / 2.0) as usize;
+ let cell_x =
+ x.saturating_sub(size_info.padding_x() as usize) % size_info.cell_width() as usize;
+ let half_cell_width = (size_info.cell_width() / 2.0) as usize;
let additional_padding =
- (size_info.width - size_info.padding_x * 2.) % size_info.cell_width;
- let end_of_grid = size_info.width - size_info.padding_x - additional_padding;
+ (size_info.width() - size_info.padding_x() * 2.) % size_info.cell_width();
+ let end_of_grid = size_info.width() - size_info.padding_x() - additional_padding;
if cell_x > half_cell_width
// Edge case when mouse leaves the window.
@@ -661,7 +662,7 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
pub fn mouse_wheel_input(&mut self, delta: MouseScrollDelta, phase: TouchPhase) {
match delta {
MouseScrollDelta::LineDelta(_columns, lines) => {
- let new_scroll_px = lines * self.ctx.size_info().cell_height;
+ let new_scroll_px = lines * self.ctx.size_info().cell_height();
self.scroll_terminal(f64::from(new_scroll_px));
},
MouseScrollDelta::PixelDelta(lpos) => {
@@ -680,7 +681,7 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
}
fn scroll_terminal(&mut self, new_scroll_px: f64) {
- let height = f64::from(self.ctx.size_info().cell_height);
+ let height = f64::from(self.ctx.size_info().cell_height());
if self.ctx.mouse_mode() {
self.ctx.mouse_mut().scroll_px += new_scroll_px;
@@ -764,13 +765,17 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
}
// Skip normal mouse events if the message bar has been clicked.
- if self.message_close_at_cursor() && state == ElementState::Pressed {
+ if self.message_bar_mouse_state() == Some(MouseState::MessageBarButton)
+ && state == ElementState::Pressed
+ {
+ let size = self.ctx.size_info();
+
+ let current_lines = self.ctx.message().map(|m| m.text(&size).len()).unwrap_or(0);
+
self.ctx.clear_selection();
self.ctx.pop_message();
// Reset cursor when message bar height changed or all messages are gone.
- let size = self.ctx.size_info();
- let current_lines = (size.lines() - self.ctx.terminal().screen_lines()).0;
let new_lines = self.ctx.message().map(|m| m.text(&size).len()).unwrap_or(0);
let new_icon = match current_lines.cmp(&new_lines) {
@@ -976,21 +981,26 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
}
}
- /// Check if the cursor is hovering above the message bar.
- fn message_at_cursor(&mut self) -> bool {
- self.ctx.mouse().line >= self.ctx.terminal().screen_lines()
- }
-
- /// Whether the point is over the message bar's close button.
- fn message_close_at_cursor(&self) -> bool {
- let mouse = self.ctx.mouse();
-
+ /// Check mouse state in relation to the message bar.
+ fn message_bar_mouse_state(&self) -> Option<MouseState> {
// Since search is above the message bar, the button is offset by search's height.
let search_height = if self.ctx.search_active() { 1 } else { 0 };
- mouse.inside_text_area
- && mouse.column + message_bar::CLOSE_BUTTON_TEXT.len() >= self.ctx.size_info().cols()
- && mouse.line == self.ctx.terminal().screen_lines() + search_height
+ // Calculate Y position of the end of the last terminal line.
+ let size = self.ctx.size_info();
+ let terminal_end = size.padding_y() as usize
+ + size.cell_height() as usize * (size.screen_lines().0 + search_height);
+
+ let mouse = self.ctx.mouse();
+ if self.ctx.message().is_none() || (mouse.y <= terminal_end) {
+ None
+ } else if mouse.y <= terminal_end + size.cell_height() as usize
+ && mouse.column + message_bar::CLOSE_BUTTON_TEXT.len() >= size.cols()
+ {
+ Some(MouseState::MessageBarButton)
+ } else {
+ Some(MouseState::MessageBar)
+ }
}
/// Copy text selection.
@@ -1016,10 +1026,8 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
/// Location of the mouse cursor.
fn mouse_state(&mut self) -> MouseState {
// Check message bar before URL to ignore URLs in the message bar.
- if self.message_close_at_cursor() {
- return MouseState::MessageBarButton;
- } else if self.message_at_cursor() {
- return MouseState::MessageBar;
+ if let Some(mouse_state) = self.message_bar_mouse_state() {
+ return mouse_state;
}
let mouse_mode = self.ctx.mouse_mode();
@@ -1048,17 +1056,18 @@ impl<'a, T: EventListener, A: ActionContext<T>> Processor<'a, T, A> {
/// Handle automatic scrolling when selecting above/below the window.
fn update_selection_scrolling(&mut self, mouse_y: i32) {
- let size_info = self.ctx.size_info();
+ let dpr = self.ctx.window().dpr;
+ let size = self.ctx.size_info();
let scheduler = self.ctx.scheduler_mut();
// Scale constants by DPI.
- let min_height = (MIN_SELECTION_SCROLLING_HEIGHT * size_info.dpr) as i32;
- let step = (SELECTION_SCROLLING_STEP * size_info.dpr) as i32;
+ let min_height = (MIN_SELECTION_SCROLLING_HEIGHT * dpr) as i32;
+ let step = (SELECTION_SCROLLING_STEP * dpr) as i32;
// Compute the height of the scrolling areas.
- let end_top = max(min_height, size_info.padding_y as i32);
- let height_bottom = max(min_height, size_info.padding_bottom() as i32);
- let start_bottom = size_info.height as i32 - height_bottom;
+ let end_top = max(min_height, size.padding_y() as i32);
+ let text_area_bottom = size.padding_y() + size.screen_lines().0 as f32 * size.cell_height();
+ let start_bottom = min(size.height() as i32 - min_height, text_area_bottom as i32);
// Get distance from closest window boundary.
let delta = if mouse_y < end_top {
@@ -1283,15 +1292,15 @@ mod tests {
url: Default::default(),
};
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(
+ 21.0,
+ 51.0,
+ 3.0,
+ 3.0,
+ 0.,
+ 0.,
+ false,
+ );
let mut clipboard = Clipboard::new_nop();
diff --git a/alacritty/src/main.rs b/alacritty/src/main.rs
index efd3e947..09296f60 100644
--- a/alacritty/src/main.rs
+++ b/alacritty/src/main.rs
@@ -138,7 +138,11 @@ fn run(
// The display manages a window and can draw the terminal.
let display = Display::new(&config, &window_event_loop)?;
- info!("PTY dimensions: {:?} x {:?}", display.size_info.lines(), display.size_info.cols());
+ info!(
+ "PTY dimensions: {:?} x {:?}",
+ display.size_info.screen_lines(),
+ display.size_info.cols()
+ );
// Create the terminal.
//
diff --git a/alacritty/src/message_bar.rs b/alacritty/src/message_bar.rs
index 4c43c3d3..851cb6ee 100644
--- a/alacritty/src/message_bar.rs
+++ b/alacritty/src/message_bar.rs
@@ -34,7 +34,9 @@ impl Message {
/// Formatted message text lines.
pub fn text(&self, size_info: &SizeInfo) -> Vec<String> {
let num_cols = size_info.cols().0;
- let max_lines = size_info.lines().saturating_sub(MIN_FREE_LINES);
+ let total_lines =
+ (size_info.height() - 2. * size_info.padding_y()) / size_info.cell_height();
+ let max_lines = (total_lines as usize).saturating_sub(MIN_FREE_LINES);
let button_len = CLOSE_BUTTON_TEXT.len();
// Split line to fit the screen.
@@ -169,7 +171,8 @@ impl MessageBuffer {
#[cfg(test)]
mod tests {
- use super::{Message, MessageBuffer, MessageType, MIN_FREE_LINES};
+ use super::*;
+
use alacritty_terminal::term::SizeInfo;
#[test]
@@ -177,15 +180,7 @@ mod tests {
let input = "a";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 7.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(7., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -197,15 +192,7 @@ mod tests {
let input = "fo\nbar";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 6.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(6., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -217,15 +204,7 @@ mod tests {
let input = "a\nb";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 6.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(6., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -237,15 +216,7 @@ mod tests {
let input = "foobar1";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 6.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(6., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -257,15 +228,7 @@ mod tests {
let input = "foobar";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 6.,
- height: 0.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(6., 0., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -277,15 +240,7 @@ mod tests {
let input = "hahahahahahahahahahaha truncate this because it's too long for the term";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 22.,
- height: (MIN_FREE_LINES + 2) as f32,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(22., (MIN_FREE_LINES + 2) as f32, 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -300,15 +255,7 @@ mod tests {
let input = "ha";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 2.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(2., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -320,15 +267,7 @@ mod tests {
let input = "hahahahahahahahaha";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 2.,
- height: (MIN_FREE_LINES + 2) as f32,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(2., (MIN_FREE_LINES + 2) as f32, 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -340,15 +279,7 @@ mod tests {
let input = "test";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 5.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(5., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
@@ -398,15 +329,7 @@ mod tests {
let input = "a\nbc defg";
let mut message_buffer = MessageBuffer::new();
message_buffer.push(Message::new(input.into(), MessageType::Error));
- let size = SizeInfo {
- width: 5.,
- height: 10.,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 0.,
- };
+ let size = SizeInfo::new(5., 10., 1., 1., 0., 0., false);
let lines = message_buffer.message().unwrap().text(&size);
diff --git a/alacritty/src/renderer/mod.rs b/alacritty/src/renderer/mod.rs
index da5f68a0..e97ac025 100644
--- a/alacritty/src/renderer/mod.rs
+++ b/alacritty/src/renderer/mod.rs
@@ -26,7 +26,6 @@ use alacritty_terminal::thread;
use crate::config::font::{Font, FontDescription};
use crate::config::ui_config::{Delta, UIConfig};
-use crate::config::window::{StartupMode, WindowConfig};
use crate::cursor;
use crate::gl;
use crate::gl::types::*;
@@ -231,7 +230,7 @@ impl GlyphCache {
if desc == regular_desc {
regular
} else {
- rasterizer.load_font(&desc, size).unwrap_or_else(|_| regular)
+ rasterizer.load_font(&desc, size).unwrap_or(regular)
}
};
@@ -358,34 +357,6 @@ impl GlyphCache {
rasterizer.metrics(regular, font.size)
}
-
- pub fn calculate_dimensions(
- window_config: &WindowConfig,
- dpr: f64,
- cell_width: f32,
- cell_height: f32,
- ) -> Option<(u32, u32)> {
- let dimensions = window_config.dimensions;
-
- if dimensions.columns_u32() == 0
- || dimensions.lines_u32() == 0
- || window_config.startup_mode != StartupMode::Windowed
- {
- return None;
- }
-
- let padding_x = f64::from(window_config.padding.x) * dpr;
- let padding_y = f64::from(window_config.padding.y) * dpr;
-
- // Calculate new size based on cols/lines specified in config.
- let grid_width = cell_width as u32 * dimensions.columns_u32();
- let grid_height = cell_height as u32 * dimensions.lines_u32();
-
- let width = padding_x.mul_add(2., f64::from(grid_width)).floor();
- let height = padding_y.mul_add(2., f64::from(grid_height)).floor();
-
- Some((width as u32, height as u32))
- }
}
#[derive(Debug)]
@@ -705,7 +676,7 @@ impl QuadRenderer {
gl::UseProgram(self.rect_program.id);
// Remove padding from viewport.
- gl::Viewport(0, 0, props.width as i32, props.height as i32);
+ gl::Viewport(0, 0, props.width() as i32, props.height() as i32);
// Change blending strategy.
gl::BlendFuncSeparate(gl::SRC_ALPHA, gl::ONE_MINUS_SRC_ALPHA, gl::SRC_ALPHA, gl::ONE);
@@ -740,10 +711,10 @@ impl QuadRenderer {
gl::BindBuffer(gl::ARRAY_BUFFER, 0);
gl::BindVertexArray(0);
- let padding_x = props.padding_x as i32;
- let padding_y = props.padding_y as i32;
- let width = props.width as i32;
- let height = props.height as i32;
+ let padding_x = props.padding_x() as i32;
+ let padding_y = props.padding_y() as i32;
+ let width = props.width() as i32;
+ let height = props.height() as i32;
gl::Viewport(padding_x, padding_y, width - 2 * padding_x, height - 2 * padding_y);
// Disable program.
@@ -821,10 +792,10 @@ impl QuadRenderer {
unsafe {
gl::UseProgram(program.id);
program.update_projection(
- props.width,
- props.height,
- props.padding_x,
- props.padding_y,
+ props.width(),
+ props.height(),
+ props.padding_x(),
+ props.padding_y(),
);
gl::UseProgram(0);
}
@@ -847,15 +818,20 @@ impl QuadRenderer {
// Viewport.
unsafe {
gl::Viewport(
- size.padding_x as i32,
- size.padding_y as i32,
- size.width as i32 - 2 * size.padding_x as i32,
- size.height as i32 - 2 * size.padding_y as i32,
+ size.padding_x() as i32,
+ size.padding_y() as i32,
+ size.width() as i32 - 2 * size.padding_x() as i32,
+ size.height() as i32 - 2 * size.padding_y() as i32,
);
// Update projection.
gl::UseProgram(self.program.id);
- self.program.update_projection(size.width, size.height, size.padding_x, size.padding_y);
+ self.program.update_projection(
+ size.width(),
+ size.height(),
+ size.padding_x(),
+ size.padding_y(),
+ );
gl::UseProgram(0);
}
}
@@ -870,8 +846,8 @@ impl QuadRenderer {
}
// Calculate rectangle position.
- let center_x = size.width / 2.;
- let center_y = size.height / 2.;
+ let center_x = size.width() / 2.;
+ let center_y = size.height() / 2.;
let x = (rect.x - center_x) / center_x;
let y = -(rect.y - center_y) / center_y;
let width = rect.width / center_x;
@@ -1226,7 +1202,7 @@ impl TextShaderProgram {
fn set_term_uniforms(&self, props: &SizeInfo) {
unsafe {
- gl::Uniform2f(self.u_cell_dim, props.cell_width, props.cell_height);
+ gl::Uniform2f(self.u_cell_dim, props.cell_width(), props.cell_height());
}
}
diff --git a/alacritty/src/renderer/rects.rs b/alacritty/src/renderer/rects.rs
index 83b59cb3..ca0bbd1c 100644
--- a/alacritty/src/renderer/rects.rs
+++ b/alacritty/src/renderer/rects.rs
@@ -99,14 +99,14 @@ impl RenderLine {
mut thickness: f32,
color: Rgb,
) -> RenderRect {
- let start_x = start.col.0 as f32 * size.cell_width;
- let end_x = (end.col.0 + 1) as f32 * size.cell_width;
+ let start_x = start.col.0 as f32 * size.cell_width();
+ let end_x = (end.col.0 + 1) as f32 * size.cell_width();
let width = end_x - start_x;
// Make sure lines are always visible.
thickness = thickness.max(1.);
- let line_bottom = (start.line.0 as f32 + 1.) * size.cell_height;
+ let line_bottom = (start.line.0 as f32 + 1.) * size.cell_height();
let baseline = line_bottom + descent;
let mut y = (baseline - position - thickness / 2.).ceil();
@@ -115,7 +115,14 @@ impl RenderLine {
y = max_y;
}
- RenderRect::new(start_x + size.padding_x, y + size.padding_y, width, thickness, color, 1.)
+ RenderRect::new(
+ start_x + size.padding_x(),
+ y + size.padding_y(),
+ width,
+ thickness,
+ color,
+ 1.,
+ )
}
}
diff --git a/alacritty/src/window.rs b/alacritty/src/window.rs
index 3319dce8..92fedc86 100644
--- a/alacritty/src/window.rs
+++ b/alacritty/src/window.rs
@@ -137,6 +137,9 @@ pub struct Window {
#[cfg(not(any(target_os = "macos", windows)))]
pub wayland_surface: Option<Attached<WlSurface>>,
+ /// Cached DPR for quickly scaling pixel sizes.
+ pub dpr: f64,
+
windowed_context: WindowedContext<PossiblyCurrent>,
current_mouse_cursor: CursorIcon,
mouse_visible: bool,
@@ -192,6 +195,8 @@ impl Window {
wayland_surface = Some(proxy.attach(wayland_event_queue.as_ref().unwrap().token()));
}
+ let dpr = windowed_context.window().scale_factor();
+
Ok(Self {
current_mouse_cursor,
mouse_visible: true,
@@ -200,6 +205,7 @@ impl Window {
should_draw: Arc::new(AtomicBool::new(true)),
#[cfg(not(any(target_os = "macos", windows)))]
wayland_surface,
+ dpr,
})
}
@@ -211,10 +217,6 @@ impl Window {
self.window().inner_size()
}
- pub fn scale_factor(&self) -> f64 {
- self.window().scale_factor()
- }
-
#[inline]
pub fn set_visible(&self, visibility: bool) {
self.window().set_visible(visibility);
@@ -387,11 +389,9 @@ impl Window {
/// Adjust the IME editor position according to the new location of the cursor.
#[cfg(not(windows))]
- pub fn update_ime_position(&mut self, point: Point, size_info: &SizeInfo) {
- let SizeInfo { cell_width, cell_height, padding_x, padding_y, .. } = size_info;
-
- let nspot_x = f64::from(padding_x + point.col.0 as f32 * cell_width);
- let nspot_y = f64::from(padding_y + (point.line.0 + 1) as f32 * cell_height);
+ pub fn update_ime_position(&mut self, point: Point, size: &SizeInfo) {
+ let nspot_x = f64::from(size.padding_x() + point.col.0 as f32 * size.cell_width());
+ let nspot_y = f64::from(size.padding_y() + (point.line.0 + 1) as f32 * size.cell_height());
self.window().set_ime_position(PhysicalPosition::new(nspot_x, nspot_y));
}
diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs
index 5038b734..91dd5f77 100644
--- a/alacritty_terminal/src/ansi.rs
+++ b/alacritty_terminal/src/ansi.rs
@@ -785,7 +785,7 @@ where
fn unhandled(params: &[&[u8]]) {
let mut buf = String::new();
for items in params {
- buf.push_str("[");
+ buf.push('[');
for item in *items {
buf.push_str(&format!("{:?},", *item as char));
}
diff --git a/alacritty_terminal/src/selection.rs b/alacritty_terminal/src/selection.rs
index 450a4633..da44feac 100644
--- a/alacritty_terminal/src/selection.rs
+++ b/alacritty_terminal/src/selection.rs
@@ -409,15 +409,7 @@ mod tests {
}
fn term(height: usize, width: usize) -> Term<Mock> {
- let size = SizeInfo {
- width: width as f32,
- height: height as f32,
- cell_width: 1.0,
- cell_height: 1.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(width as f32, height as f32, 1.0, 1.0, 0.0, 0.0, false);
Term::new(&MockConfig::default(), size, Mock)
}
@@ -432,7 +424,7 @@ mod tests {
let mut selection = Selection::new(SelectionType::Simple, location, Side::Left);
selection.update(location, Side::Right);
- assert_eq!(selection.to_range(&term(1, 1)).unwrap(), SelectionRange {
+ assert_eq!(selection.to_range(&term(1, 2)).unwrap(), SelectionRange {
start: location,
end: location,
is_block: false
@@ -450,7 +442,7 @@ mod tests {
let mut selection = Selection::new(SelectionType::Simple, location, Side::Right);
selection.update(location, Side::Left);
- assert_eq!(selection.to_range(&term(1, 1)).unwrap(), SelectionRange {
+ assert_eq!(selection.to_range(&term(1, 2)).unwrap(), SelectionRange {
start: location,
end: location,
is_block: false
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs
index 00726dad..a33ac919 100644
--- a/alacritty_terminal/src/term/mod.rs
+++ b/alacritty_terminal/src/term/mod.rs
@@ -40,8 +40,13 @@ const MAX_SEARCH_LINES: usize = 100;
/// Default tab interval, corresponding to terminfo `it` value.
const INITIAL_TABSTOPS: usize = 8;
-/// Minimum number of columns and lines.
-const MIN_SIZE: usize = 2;
+/// Minimum number of columns.
+///
+/// A minimum of 2 is necessary to hold fullwidth unicode characters.
+pub const MIN_COLS: usize = 2;
+
+/// Minimum number of visible lines.
+pub const MIN_SCREEN_LINES: usize = 1;
/// Cursor storing all information relevant for rendering.
#[derive(Debug, Eq, PartialEq, Copy, Clone, Deserialize)]
@@ -612,69 +617,139 @@ impl From<&BellConfig> for VisualBell {
#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq)]
pub struct SizeInfo {
/// Terminal window width.
- pub width: f32,
+ width: f32,
/// Terminal window height.
- pub height: f32,
+ height: f32,
/// Width of individual cell.
- pub cell_width: f32,
+ cell_width: f32,
/// Height of individual cell.
- pub cell_height: f32,
+ cell_height: f32,
/// Horizontal window padding.
- pub padding_x: f32,
+ padding_x: f32,
/// Horizontal window padding.
- pub padding_y: f32,
+ padding_y: f32,
- /// DPR of the current window.
- #[serde(default)]
- pub dpr: f64,
+ /// Number of lines in the viewport.
+ screen_lines: Line,
+
+ /// Number of columns in the viewport.
+ cols: Column,
}
impl SizeInfo {
- #[inline]
- pub fn lines(&self) -> Line {
- Line(((self.height - 2. * self.padding_y) / self.cell_height) as usize)
- }
+ #[allow(clippy::too_many_arguments)]
+ pub fn new(
+ width: f32,
+ height: f32,
+ cell_width: f32,
+ cell_height: f32,
+ mut padding_x: f32,
+ mut padding_y: f32,
+ dynamic_padding: bool,
+ ) -> SizeInfo {
+ if dynamic_padding {
+ padding_x = Self::dynamic_padding(padding_x.floor(), width, cell_width);
+ padding_y = Self::dynamic_padding(padding_y.floor(), height, cell_height);
+ }
- #[inline]
- pub fn cols(&self) -> Column {
- Column(((self.width - 2. * self.padding_x) / self.cell_width) as usize)
- }
+ let lines = (height - 2. * padding_y) / cell_height;
+ let screen_lines = Line(max(lines as usize, MIN_SCREEN_LINES));
- #[inline]
- pub fn padding_right(&self) -> usize {
- (self.padding_x + (self.width - 2. * self.padding_x) % self.cell_width) as usize
+ let cols = (width - 2. * padding_x) / cell_width;
+ let cols = Column(max(cols as usize, MIN_COLS));
+
+ SizeInfo {
+ width,
+ height,
+ cell_width,
+ cell_height,
+ padding_x: padding_x.floor(),
+ padding_y: padding_y.floor(),
+ screen_lines,
+ cols,
+ }
}
#[inline]
- pub fn padding_bottom(&self) -> usize {
- (self.padding_y + (self.height - 2. * self.padding_y) % self.cell_height) as usize
+ pub fn reserve_lines(&mut self, count: usize) {
+ self.screen_lines = Line(max(self.screen_lines.saturating_sub(count), MIN_SCREEN_LINES));
}
/// Check if coordinates are inside the terminal grid.
///
- /// The padding is not counted as part of the grid.
+ /// The padding, message bar or search are not counted as part of the grid.
#[inline]
pub fn contains_point(&self, x: usize, y: usize) -> bool {
- x < (self.width as usize - self.padding_right())
- && x >= self.padding_x as usize
- && y < (self.height as usize - self.padding_bottom())
- && y >= self.padding_y as usize
+ x <= (self.padding_x + self.cols.0 as f32 * self.cell_width) as usize
+ && x > self.padding_x as usize
+ && y <= (self.padding_y + self.screen_lines.0 as f32 * self.cell_height) as usize
+ && y > self.padding_y as usize
}
+ /// Convert window space pixels to terminal grid coordinates.
+ ///
+ /// If the coordinates are outside of the terminal grid, like positions inside the padding, the
+ /// coordinates will be clamped to the closest grid coordinates.
pub fn pixels_to_coords(&self, x: usize, y: usize) -> Point {
let col = Column(x.saturating_sub(self.padding_x as usize) / (self.cell_width as usize));
let line = Line(y.saturating_sub(self.padding_y as usize) / (self.cell_height as usize));
Point {
- line: min(line, Line(self.lines().saturating_sub(1))),
- col: min(col, Column(self.cols().saturating_sub(1))),
+ line: min(line, Line(self.screen_lines.saturating_sub(1))),
+ col: min(col, Column(self.cols.saturating_sub(1))),
}
}
+
+ #[inline]
+ pub fn width(&self) -> f32 {
+ self.width
+ }
+
+ #[inline]
+ pub fn height(&self) -> f32 {
+ self.height
+ }
+
+ #[inline]
+ pub fn cell_width(&self) -> f32 {
+ self.cell_width
+ }
+
+ #[inline]
+ pub fn cell_height(&self) -> f32 {
+ self.cell_height
+ }
+
+ #[inline]
+ pub fn padding_x(&self) -> f32 {
+ self.padding_x
+ }
+
+ #[inline]
+ pub fn padding_y(&self) -> f32 {
+ self.padding_y
+ }
+
+ #[inline]
+ pub fn screen_lines(&self) -> Line {
+ self.screen_lines
+ }
+
+ #[inline]
+ pub fn cols(&self) -> Column {
+ self.cols
+ }
+
+ /// Calculate padding to spread it evenly around the terminal content.
+ #[inline]
+ fn dynamic_padding(padding: f32, dimension: f32, cell_dimension: f32) -> f32 {
+ padding + ((dimension - 2. * padding) % cell_dimension) / 2.
+ }
}
pub struct Term<T> {
@@ -751,8 +826,9 @@ pub struct Term<T> {
/// Current forward and backward buffer search regexes.
regex_search: Option<RegexSearch>,
- /// Information about window dimensions.
- size: SizeInfo,
+ /// Information about cell dimensions.
+ cell_width: usize,
+ cell_height: usize,
}
impl<T> Term<T> {
@@ -767,8 +843,8 @@ impl<T> Term<T> {
}
pub fn new<C>(config: &Config<C>, size: SizeInfo, event_proxy: T) -> Term<T> {
- let num_cols = size.cols();
- let num_lines = size.lines();
+ let num_cols = size.cols;
+ let num_lines = size.screen_lines;
let history_size = config.scrolling.history() as usize;
let grid = Grid::new(num_lines, num_cols, history_size, Cell::default());
@@ -803,7 +879,8 @@ impl<T> Term<T> {
title_stack: Vec::new(),
selection: None,
regex_search: None,
- size,
+ cell_width: size.cell_width as usize,
+ cell_height: size.cell_height as usize,
}
}
@@ -974,12 +1051,14 @@ impl<T> Term<T> {
/// Resize terminal to new dimensions.
pub fn resize(&mut self, size: SizeInfo) {
- self.size = size;
+ self.cell_width = size.cell_width as usize;
+ self.cell_height = size.cell_height as usize;
let old_cols = self.cols();
let old_lines = self.screen_lines();
- let num_cols = max(size.cols(), Column(MIN_SIZE));
- let num_lines = max(size.lines(), Line(MIN_SIZE));
+
+ let num_cols = size.cols;
+ let num_lines = size.screen_lines;
if old_cols == num_cols && old_lines == num_lines {
debug!("Term::resize dimensions unchanged");
@@ -2233,8 +2312,8 @@ impl<T: EventListener> Handler for Term<T> {
#[inline]
fn text_area_size_pixels<W: io::Write>(&mut self, writer: &mut W) {
- let width = self.size.cell_width as usize * self.cols().0;
- let height = self.size.cell_height as usize * self.screen_lines().0;
+ let width = self.cell_width * self.cols().0;
+ let height = self.cell_height * self.screen_lines().0;
let _ = write!(writer, "\x1b[4;{};{}t", height, width);
}
@@ -2356,15 +2435,7 @@ pub mod test {
.unwrap_or(0);
// Create terminal with the appropriate dimensions.
- let size = SizeInfo {
- width: num_cols as f32,
- height: lines.len() as f32,
- cell_width: 1.,
- cell_height: 1.,
- padding_x: 0.,
- padding_y: 0.,
- dpr: 1.,
- };
+ let size = SizeInfo::new(num_cols as f32, lines.len() as f32, 1., 1., 0., 0., false);
let mut term = Term::new(&Config::<()>::default(), size, ());
// Fill terminal with content.
@@ -2413,15 +2484,7 @@ mod tests {
#[test]
fn semantic_selection_works() {
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
let mut grid: Grid<Cell> = Grid::new(Line(3), Column(5), 0, Cell::default());
for i in 0..5 {
@@ -2469,15 +2532,7 @@ mod tests {
#[test]
fn line_selection_works() {
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
let mut grid: Grid<Cell> = Grid::new(Line(1), Column(5), 0, Cell::default());
for i in 0..5 {
@@ -2498,15 +2553,7 @@ mod tests {
#[test]
fn selecting_empty_line() {
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
let mut grid: Grid<Cell> = Grid::new(Line(3), Column(3), 0, Cell::default());
for l in 0..3 {
@@ -2543,15 +2590,7 @@ mod tests {
#[test]
fn input_line_drawing_character() {
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
let cursor = Point::new(Line(0), Column(0));
term.configure_charset(CharsetIndex::G0, StandardCharset::SpecialCharacterAndLineDrawing);
@@ -2562,15 +2601,7 @@ mod tests {
#[test]
fn clear_saved_lines() {
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
// Add one line of scrollback.
@@ -2592,15 +2623,7 @@ mod tests {
#[test]
fn grow_lines_updates_active_cursor_pos() {
- let mut size = SizeInfo {
- width: 100.0,
- height: 10.0,
- cell_width: 1.0,
- cell_height: 1.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
// Create 10 lines of scrollback.
@@ -2611,7 +2634,7 @@ mod tests {
assert_eq!(term.grid.cursor.point, Point::new(Line(9), Column(0)));
// Increase visible lines.
- size.height = 30.;
+ size.screen_lines.0 = 30;
term.resize(size);
assert_eq!(term.history_size(), 0);
@@ -2620,15 +2643,7 @@ mod tests {
#[test]
fn grow_lines_updates_inactive_cursor_pos() {
- let mut size = SizeInfo {
- width: 100.0,
- height: 10.0,
- cell_width: 1.0,
- cell_height: 1.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
// Create 10 lines of scrollback.
@@ -2642,7 +2657,7 @@ mod tests {
term.set_mode(ansi::Mode::SwapScreenAndSetRestoreCursor);
// Increase visible lines.
- size.height = 30.;
+ size.screen_lines.0 = 30;
term.resize(size);
// Leave alt screen.
@@ -2654,15 +2669,7 @@ mod tests {
#[test]
fn shrink_lines_updates_active_cursor_pos() {
- let mut size = SizeInfo {
- width: 100.0,
- height: 10.0,
- cell_width: 1.0,
- cell_height: 1.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
// Create 10 lines of scrollback.
@@ -2673,7 +2680,7 @@ mod tests {
assert_eq!(term.grid.cursor.point, Point::new(Line(9), Column(0)));
// Increase visible lines.
- size.height = 5.;
+ size.screen_lines.0 = 5;
term.resize(size);
assert_eq!(term.history_size(), 15);
@@ -2682,15 +2689,7 @@ mod tests {
#[test]
fn shrink_lines_updates_inactive_cursor_pos() {
- let mut size = SizeInfo {
- width: 100.0,
- height: 10.0,
- cell_width: 1.0,
- cell_height: 1.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
// Create 10 lines of scrollback.
@@ -2704,7 +2703,7 @@ mod tests {
term.set_mode(ansi::Mode::SwapScreenAndSetRestoreCursor);
// Increase visible lines.
- size.height = 5.;
+ size.screen_lines.0 = 5;
term.resize(size);
// Leave alt screen.
@@ -2716,15 +2715,7 @@ mod tests {
#[test]
fn window_title() {
- let size = SizeInfo {
- width: 21.0,
- height: 51.0,
- cell_width: 3.0,
- cell_height: 3.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false);
let mut term = Term::new(&MockConfig::default(), size, Mock);
// Title None by default.
diff --git a/alacritty_terminal/src/tty/unix.rs b/alacritty_terminal/src/tty/unix.rs
index c52da34d..9cce1983 100644
--- a/alacritty_terminal/src/tty/unix.rs
+++ b/alacritty_terminal/src/tty/unix.rs
@@ -357,10 +357,10 @@ pub trait ToWinsize {
impl<'a> ToWinsize for &'a SizeInfo {
fn to_winsize(&self) -> winsize {
winsize {
- ws_row: self.lines().0 as libc::c_ushort,
+ ws_row: self.screen_lines().0 as libc::c_ushort,
ws_col: self.cols().0 as libc::c_ushort,
- ws_xpixel: self.width as libc::c_ushort,
- ws_ypixel: self.height as libc::c_ushort,
+ ws_xpixel: self.width() as libc::c_ushort,
+ ws_ypixel: self.height() as libc::c_ushort,
}
}
}
diff --git a/alacritty_terminal/src/tty/windows/conpty.rs b/alacritty_terminal/src/tty/windows/conpty.rs
index b9748c8b..5469c7fe 100644
--- a/alacritty_terminal/src/tty/windows/conpty.rs
+++ b/alacritty_terminal/src/tty/windows/conpty.rs
@@ -233,12 +233,12 @@ impl OnResize for Conpty {
}
/// Helper to build a COORD from a SizeInfo, returning None in overflow cases.
-fn coord_from_sizeinfo(sizeinfo: &SizeInfo) -> Option<COORD> {
- let cols = sizeinfo.cols().0;
- let lines = sizeinfo.lines().0;
+fn coord_from_sizeinfo(size: &SizeInfo) -> Option<COORD> {
+ let cols = size.cols().0;
+ let lines = size.screen_lines().0;
if cols <= i16::MAX as usize && lines <= i16::MAX as usize {
- Some(COORD { X: sizeinfo.cols().0 as i16, Y: sizeinfo.lines().0 as i16 })
+ Some(COORD { X: cols as i16, Y: lines as i16 })
} else {
None
}
diff --git a/alacritty_terminal/src/tty/windows/winpty.rs b/alacritty_terminal/src/tty/windows/winpty.rs
index f9dd56bb..5de4b401 100644
--- a/alacritty_terminal/src/tty/windows/winpty.rs
+++ b/alacritty_terminal/src/tty/windows/winpty.rs
@@ -20,7 +20,7 @@ pub fn new<C>(config: &Config<C>, size: &SizeInfo, _window_id: Option<usize>) ->
// Create config.
let mut wconfig = WinptyConfig::new(ConfigFlags::empty()).unwrap();
- wconfig.set_initial_size(size.cols().0 as i32, size.lines().0 as i32);
+ wconfig.set_initial_size(size.cols().0 as i32, size.screen_lines().0 as i32);
wconfig.set_mouse_mode(&MouseMode::Auto);
// Start agent.
@@ -60,8 +60,8 @@ pub fn new<C>(config: &Config<C>, size: &SizeInfo, _window_id: Option<usize>) ->
}
impl OnResize for Agent {
- fn on_resize(&mut self, sizeinfo: &SizeInfo) {
- let (cols, lines) = (sizeinfo.cols().0, sizeinfo.lines().0);
+ fn on_resize(&mut self, size: &SizeInfo) {
+ let (cols, lines) = (size.cols().0, size.screen_lines().0);
if cols > 0 && cols <= u16::MAX as usize && lines > 0 && lines <= u16::MAX as usize {
self.set_size(cols as u16, lines as u16)
.unwrap_or_else(|_| info!("Unable to set WinPTY size, did it die?"));
diff --git a/alacritty_terminal/src/vi_mode.rs b/alacritty_terminal/src/vi_mode.rs
index 53534f73..3959494f 100644
--- a/alacritty_terminal/src/vi_mode.rs
+++ b/alacritty_terminal/src/vi_mode.rs
@@ -407,15 +407,7 @@ mod tests {
}
fn term() -> Term<Mock> {
- let size = SizeInfo {
- width: 20.,
- height: 20.,
- cell_width: 1.0,
- cell_height: 1.0,
- padding_x: 0.0,
- padding_y: 0.0,
- dpr: 1.0,
- };
+ let size = SizeInfo::new(20., 20., 1.0, 1.0, 0.0, 0.0, false);
Term::new(&MockConfig::default(), size, Mock)
}
diff --git a/alacritty_terminal/tests/ref/alt_reset/size.json b/alacritty_terminal/tests/ref/alt_reset/size.json
index 99712902..f0e7f283 100644
--- a/alacritty_terminal/tests/ref/alt_reset/size.json
+++ b/alacritty_terminal/tests/ref/alt_reset/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":106,"screen_lines":30}
diff --git a/alacritty_terminal/tests/ref/clear_underline/size.json b/alacritty_terminal/tests/ref/clear_underline/size.json
index 5a7fe4e4..a76b7abd 100644
--- a/alacritty_terminal/tests/ref/clear_underline/size.json
+++ b/alacritty_terminal/tests/ref/clear_underline/size.json
@@ -1 +1 @@
-{"width":662.0,"height":708.0,"cell_width":10.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"dpr":1.0833333333333333} \ No newline at end of file
+{"width":662.0,"height":708.0,"cell_width":10.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"cols":66,"screen_lines":32}
diff --git a/alacritty_terminal/tests/ref/colored_reset/size.json b/alacritty_terminal/tests/ref/colored_reset/size.json
index f7b43e61..6054e742 100644
--- a/alacritty_terminal/tests/ref/colored_reset/size.json
+++ b/alacritty_terminal/tests/ref/colored_reset/size.json
@@ -1 +1 @@
-{"width":939.0,"height":1020.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":6.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":1020.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":6.0,"cols":116,"screen_lines":63}
diff --git a/alacritty_terminal/tests/ref/csi_rep/size.json b/alacritty_terminal/tests/ref/csi_rep/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/csi_rep/size.json
+++ b/alacritty_terminal/tests/ref/csi_rep/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/decaln_reset/size.json b/alacritty_terminal/tests/ref/decaln_reset/size.json
index 99712902..f0e7f283 100644
--- a/alacritty_terminal/tests/ref/decaln_reset/size.json
+++ b/alacritty_terminal/tests/ref/decaln_reset/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":106,"screen_lines":30}
diff --git a/alacritty_terminal/tests/ref/deccolm_reset/size.json b/alacritty_terminal/tests/ref/deccolm_reset/size.json
index 99712902..f0e7f283 100644
--- a/alacritty_terminal/tests/ref/deccolm_reset/size.json
+++ b/alacritty_terminal/tests/ref/deccolm_reset/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":106,"screen_lines":30}
diff --git a/alacritty_terminal/tests/ref/delete_chars_reset/size.json b/alacritty_terminal/tests/ref/delete_chars_reset/size.json
index 99712902..f0e7f283 100644
--- a/alacritty_terminal/tests/ref/delete_chars_reset/size.json
+++ b/alacritty_terminal/tests/ref/delete_chars_reset/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":106,"screen_lines":30}
diff --git a/alacritty_terminal/tests/ref/delete_lines/size.json b/alacritty_terminal/tests/ref/delete_lines/size.json
index 11c7c565..48d2598b 100644
--- a/alacritty_terminal/tests/ref/delete_lines/size.json
+++ b/alacritty_terminal/tests/ref/delete_lines/size.json
@@ -1 +1 @@
-{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"cols":116,"screen_lines":31}
diff --git a/alacritty_terminal/tests/ref/erase_chars_reset/size.json b/alacritty_terminal/tests/ref/erase_chars_reset/size.json
index 99712902..f0e7f283 100644
--- a/alacritty_terminal/tests/ref/erase_chars_reset/size.json
+++ b/alacritty_terminal/tests/ref/erase_chars_reset/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":106,"screen_lines":30}
diff --git a/alacritty_terminal/tests/ref/fish_cc/size.json b/alacritty_terminal/tests/ref/fish_cc/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/fish_cc/size.json
+++ b/alacritty_terminal/tests/ref/fish_cc/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/grid_reset/size.json b/alacritty_terminal/tests/ref/grid_reset/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/grid_reset/size.json
+++ b/alacritty_terminal/tests/ref/grid_reset/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/history/size.json b/alacritty_terminal/tests/ref/history/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/history/size.json
+++ b/alacritty_terminal/tests/ref/history/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/indexed_256_colors/size.json b/alacritty_terminal/tests/ref/indexed_256_colors/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/indexed_256_colors/size.json
+++ b/alacritty_terminal/tests/ref/indexed_256_colors/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/insert_blank_reset/size.json b/alacritty_terminal/tests/ref/insert_blank_reset/size.json
index 99712902..f0e7f283 100644
--- a/alacritty_terminal/tests/ref/insert_blank_reset/size.json
+++ b/alacritty_terminal/tests/ref/insert_blank_reset/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":1054.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":106,"screen_lines":30}
diff --git a/alacritty_terminal/tests/ref/issue_855/size.json b/alacritty_terminal/tests/ref/issue_855/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/issue_855/size.json
+++ b/alacritty_terminal/tests/ref/issue_855/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/ll/size.json b/alacritty_terminal/tests/ref/ll/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/ll/size.json
+++ b/alacritty_terminal/tests/ref/ll/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/newline_with_cursor_beyond_scroll_region/size.json b/alacritty_terminal/tests/ref/newline_with_cursor_beyond_scroll_region/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/newline_with_cursor_beyond_scroll_region/size.json
+++ b/alacritty_terminal/tests/ref/newline_with_cursor_beyond_scroll_region/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/region_scroll_down/size.json b/alacritty_terminal/tests/ref/region_scroll_down/size.json
index 11c7c565..48d2598b 100644
--- a/alacritty_terminal/tests/ref/region_scroll_down/size.json
+++ b/alacritty_terminal/tests/ref/region_scroll_down/size.json
@@ -1 +1 @@
-{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"cols":116,"screen_lines":31}
diff --git a/alacritty_terminal/tests/ref/row_reset/size.json b/alacritty_terminal/tests/ref/row_reset/size.json
index 97fa803f..927f25db 100644
--- a/alacritty_terminal/tests/ref/row_reset/size.json
+++ b/alacritty_terminal/tests/ref/row_reset/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1040.0,"cell_width":11.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1040.0,"cell_width":11.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"cols":172,"screen_lines":47}
diff --git a/alacritty_terminal/tests/ref/saved_cursor/size.json b/alacritty_terminal/tests/ref/saved_cursor/size.json
index 8a55d412..8f19f0da 100644
--- a/alacritty_terminal/tests/ref/saved_cursor/size.json
+++ b/alacritty_terminal/tests/ref/saved_cursor/size.json
@@ -1 +1 @@
-{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"dpr":1.1666666666666667} \ No newline at end of file
+{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"cols":139,"screen_lines":35}
diff --git a/alacritty_terminal/tests/ref/saved_cursor_alt/size.json b/alacritty_terminal/tests/ref/saved_cursor_alt/size.json
index 8a55d412..8f19f0da 100644
--- a/alacritty_terminal/tests/ref/saved_cursor_alt/size.json
+++ b/alacritty_terminal/tests/ref/saved_cursor_alt/size.json
@@ -1 +1 @@
-{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"dpr":1.1666666666666667} \ No newline at end of file
+{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"cols":139,"screen_lines":35}
diff --git a/alacritty_terminal/tests/ref/scroll_up_reset/size.json b/alacritty_terminal/tests/ref/scroll_up_reset/size.json
index 8ec182ba..86a3d608 100644
--- a/alacritty_terminal/tests/ref/scroll_up_reset/size.json
+++ b/alacritty_terminal/tests/ref/scroll_up_reset/size.json
@@ -1 +1 @@
-{"width":1840.0,"height":1040.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1840.0,"height":1040.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":102,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/selective_erasure/size.json b/alacritty_terminal/tests/ref/selective_erasure/size.json
index 58891d8a..47012031 100644
--- a/alacritty_terminal/tests/ref/selective_erasure/size.json
+++ b/alacritty_terminal/tests/ref/selective_erasure/size.json
@@ -1 +1 @@
-{"width":70.0,"height":63.0,"cell_width":7.0,"cell_height":21.0,"padding_x":0.0,"padding_y":0.0,"dpr":1.0} \ No newline at end of file
+{"width":70.0,"height":63.0,"cell_width":7.0,"cell_height":21.0,"padding_x":0.0,"padding_y":0.0,"cols":10,"screen_lines":3}
diff --git a/alacritty_terminal/tests/ref/sgr/size.json b/alacritty_terminal/tests/ref/sgr/size.json
index 8a55d412..8f19f0da 100644
--- a/alacritty_terminal/tests/ref/sgr/size.json
+++ b/alacritty_terminal/tests/ref/sgr/size.json
@@ -1 +1 @@
-{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"dpr":1.1666666666666667} \ No newline at end of file
+{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"cols":139,"screen_lines":35}
diff --git a/alacritty_terminal/tests/ref/tab_rendering/size.json b/alacritty_terminal/tests/ref/tab_rendering/size.json
index f7b43e61..6054e742 100644
--- a/alacritty_terminal/tests/ref/tab_rendering/size.json
+++ b/alacritty_terminal/tests/ref/tab_rendering/size.json
@@ -1 +1 @@
-{"width":939.0,"height":1020.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":6.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":1020.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":6.0,"cols":116,"screen_lines":63}
diff --git a/alacritty_terminal/tests/ref/tmux_git_log/size.json b/alacritty_terminal/tests/ref/tmux_git_log/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/tmux_git_log/size.json
+++ b/alacritty_terminal/tests/ref/tmux_git_log/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/tmux_htop/size.json b/alacritty_terminal/tests/ref/tmux_htop/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/tmux_htop/size.json
+++ b/alacritty_terminal/tests/ref/tmux_htop/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/underline/size.json b/alacritty_terminal/tests/ref/underline/size.json
index 11c7c565..48d2598b 100644
--- a/alacritty_terminal/tests/ref/underline/size.json
+++ b/alacritty_terminal/tests/ref/underline/size.json
@@ -1 +1 @@
-{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"cols":116,"screen_lines":31}
diff --git a/alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json b/alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json
index 4cb2c708..3ceb4618 100644
--- a/alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json
+++ b/alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json
@@ -1 +1 @@
-{"width":1916.0,"height":2121.0,"cell_width":11.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1916.0,"height":2121.0,"cell_width":11.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"cols":174,"screen_lines":96}
diff --git a/alacritty_terminal/tests/ref/vim_large_window_scroll/size.json b/alacritty_terminal/tests/ref/vim_large_window_scroll/size.json
index 97fa803f..927f25db 100644
--- a/alacritty_terminal/tests/ref/vim_large_window_scroll/size.json
+++ b/alacritty_terminal/tests/ref/vim_large_window_scroll/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1040.0,"cell_width":11.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1040.0,"cell_width":11.0,"cell_height":22.0,"padding_x":0.0,"padding_y":0.0,"cols":172,"screen_lines":47}
diff --git a/alacritty_terminal/tests/ref/vim_simple_edit/size.json b/alacritty_terminal/tests/ref/vim_simple_edit/size.json
index eb12da0f..b8c739ea 100644
--- a/alacritty_terminal/tests/ref/vim_simple_edit/size.json
+++ b/alacritty_terminal/tests/ref/vim_simple_edit/size.json
@@ -1 +1 @@
-{"width":644.0,"height":412.0,"cell_width":8.0,"cell_height":17.0,"padding_x":0.0,"padding_y":0.0} \ No newline at end of file
+{"width":644.0,"height":412.0,"cell_width":8.0,"cell_height":17.0,"padding_x":0.0,"padding_y":0.0,"cols":80,"screen_lines":24}
diff --git a/alacritty_terminal/tests/ref/vttest_cursor_movement_1/size.json b/alacritty_terminal/tests/ref/vttest_cursor_movement_1/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/vttest_cursor_movement_1/size.json
+++ b/alacritty_terminal/tests/ref/vttest_cursor_movement_1/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/vttest_insert/size.json b/alacritty_terminal/tests/ref/vttest_insert/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/vttest_insert/size.json
+++ b/alacritty_terminal/tests/ref/vttest_insert/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/vttest_origin_mode_1/size.json b/alacritty_terminal/tests/ref/vttest_origin_mode_1/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/vttest_origin_mode_1/size.json
+++ b/alacritty_terminal/tests/ref/vttest_origin_mode_1/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/vttest_origin_mode_2/size.json b/alacritty_terminal/tests/ref/vttest_origin_mode_2/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/vttest_origin_mode_2/size.json
+++ b/alacritty_terminal/tests/ref/vttest_origin_mode_2/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/vttest_scroll/size.json b/alacritty_terminal/tests/ref/vttest_scroll/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/vttest_scroll/size.json
+++ b/alacritty_terminal/tests/ref/vttest_scroll/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}
diff --git a/alacritty_terminal/tests/ref/vttest_tab_clear_set/size.json b/alacritty_terminal/tests/ref/vttest_tab_clear_set/size.json
index 11c7c565..48d2598b 100644
--- a/alacritty_terminal/tests/ref/vttest_tab_clear_set/size.json
+++ b/alacritty_terminal/tests/ref/vttest_tab_clear_set/size.json
@@ -1 +1 @@
-{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"cols":116,"screen_lines":31}
diff --git a/alacritty_terminal/tests/ref/wrapline_alt_toggle/size.json b/alacritty_terminal/tests/ref/wrapline_alt_toggle/size.json
index 8a55d412..8f19f0da 100644
--- a/alacritty_terminal/tests/ref/wrapline_alt_toggle/size.json
+++ b/alacritty_terminal/tests/ref/wrapline_alt_toggle/size.json
@@ -1 +1 @@
-{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"dpr":1.1666666666666667} \ No newline at end of file
+{"width":1259.0,"height":683.0,"cell_width":9.0,"cell_height":19.0,"padding_x":4.0,"padding_y":9.0,"cols":139,"screen_lines":35}
diff --git a/alacritty_terminal/tests/ref/zerowidth/size.json b/alacritty_terminal/tests/ref/zerowidth/size.json
index 11c7c565..48d2598b 100644
--- a/alacritty_terminal/tests/ref/zerowidth/size.json
+++ b/alacritty_terminal/tests/ref/zerowidth/size.json
@@ -1 +1 @@
-{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"dpr":1.0} \ No newline at end of file
+{"width":939.0,"height":503.0,"cell_width":8.0,"cell_height":16.0,"padding_x":5.0,"padding_y":3.0,"cols":116,"screen_lines":31}
diff --git a/alacritty_terminal/tests/ref/zsh_tab_completion/size.json b/alacritty_terminal/tests/ref/zsh_tab_completion/size.json
index 8439a658..0ac0cba2 100644
--- a/alacritty_terminal/tests/ref/zsh_tab_completion/size.json
+++ b/alacritty_terminal/tests/ref/zsh_tab_completion/size.json
@@ -1 +1 @@
-{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"dpr":2.0} \ No newline at end of file
+{"width":1900.0,"height":1038.0,"cell_width":18.0,"cell_height":35.0,"padding_x":0.0,"padding_y":0.0,"cols":105,"screen_lines":29}