diff --git a/alacritty/src/display/cursor.rs b/alacritty/src/display/cursor.rs index f3a782cc..89b0bcde 100644 --- a/alacritty/src/display/cursor.rs +++ b/alacritty/src/display/cursor.rs @@ -2,9 +2,9 @@ use alacritty_terminal::ansi::CursorShape; use alacritty_terminal::term::color::Rgb; -use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCursor; +use crate::display::SizeInfo; use crate::renderer::rects::RenderRect; /// Trait for conversion into the iterator. diff --git a/alacritty/src/display/damage.rs b/alacritty/src/display/damage.rs index d6a69a2d..d9b271c5 100644 --- a/alacritty/src/display/damage.rs +++ b/alacritty/src/display/damage.rs @@ -3,7 +3,9 @@ use std::iter::Peekable; use glutin::Rect; -use alacritty_terminal::term::{LineDamageBounds, SizeInfo, TermDamageIterator}; +use alacritty_terminal::term::{LineDamageBounds, TermDamageIterator}; + +use crate::display::SizeInfo; /// Iterator which converts `alacritty_terminal` damage information into renderer damaged rects. pub struct RenderDamageIterator<'a> { diff --git a/alacritty/src/display/mod.rs b/alacritty/src/display/mod.rs index 1fdc5ac1..5bd0a097 100644 --- a/alacritty/src/display/mod.rs +++ b/alacritty/src/display/mod.rs @@ -16,6 +16,7 @@ use glutin::window::CursorIcon; use glutin::Rect as DamageRect; use log::{debug, info}; use parking_lot::MutexGuard; +use serde::{Deserialize, Serialize}; use unicode_width::UnicodeWidthChar; #[cfg(all(feature = "wayland", not(any(target_os = "macos", windows))))] use wayland_client::EventQueue; @@ -24,15 +25,13 @@ use crossfont::{self, Rasterize, Rasterizer}; use alacritty_terminal::ansi::NamedColor; use alacritty_terminal::config::MAX_SCROLLBACK_LINES; -use alacritty_terminal::event::{EventListener, OnResize}; -use alacritty_terminal::grid::Dimensions as _; +use alacritty_terminal::event::{EventListener, OnResize, WindowSize}; +use alacritty_terminal::grid::Dimensions as TermDimensions; use alacritty_terminal::index::{Column, Direction, Line, Point}; use alacritty_terminal::selection::{Selection, SelectionRange}; use alacritty_terminal::term::cell::Flags; use alacritty_terminal::term::color::Rgb; -use alacritty_terminal::term::{ - SizeInfo, Term, TermDamage, TermMode, MIN_COLUMNS, MIN_SCREEN_LINES, -}; +use alacritty_terminal::term::{Term, TermDamage, TermMode, MIN_COLUMNS, MIN_SCREEN_LINES}; use crate::config::font::Font; #[cfg(not(windows))] @@ -135,6 +134,166 @@ impl From for Error { } } +/// Terminal size info. +#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq)] +pub struct SizeInfo { + /// Terminal window width. + width: T, + + /// Terminal window height. + height: T, + + /// Width of individual cell. + cell_width: T, + + /// Height of individual cell. + cell_height: T, + + /// Horizontal window padding. + padding_x: T, + + /// Vertical window padding. + padding_y: T, + + /// Number of lines in the viewport. + screen_lines: usize, + + /// Number of columns in the viewport. + columns: usize, +} + +impl From> for SizeInfo { + fn from(size_info: SizeInfo) -> Self { + Self { + width: size_info.width as u32, + height: size_info.height as u32, + cell_width: size_info.cell_width as u32, + cell_height: size_info.cell_height as u32, + padding_x: size_info.padding_x as u32, + padding_y: size_info.padding_y as u32, + screen_lines: size_info.screen_lines, + columns: size_info.screen_lines, + } + } +} + +impl From> for WindowSize { + fn from(size_info: SizeInfo) -> Self { + Self { + num_cols: size_info.columns() as u16, + num_lines: size_info.screen_lines() as u16, + cell_width: size_info.cell_width() as u16, + cell_height: size_info.cell_width() as u16, + } + } +} + +impl SizeInfo { + #[inline] + pub fn width(&self) -> T { + self.width + } + + #[inline] + pub fn height(&self) -> T { + self.height + } + + #[inline] + pub fn cell_width(&self) -> T { + self.cell_width + } + + #[inline] + pub fn cell_height(&self) -> T { + self.cell_height + } + + #[inline] + pub fn padding_x(&self) -> T { + self.padding_x + } + + #[inline] + pub fn padding_y(&self) -> T { + self.padding_y + } +} + +impl SizeInfo { + #[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); + } + + let lines = (height - 2. * padding_y) / cell_height; + let screen_lines = cmp::max(lines as usize, MIN_SCREEN_LINES); + + let columns = (width - 2. * padding_x) / cell_width; + let columns = cmp::max(columns as usize, MIN_COLUMNS); + + SizeInfo { + width, + height, + cell_width, + cell_height, + padding_x: padding_x.floor(), + padding_y: padding_y.floor(), + screen_lines, + columns, + } + } + + #[inline] + pub fn reserve_lines(&mut self, count: usize) { + self.screen_lines = cmp::max(self.screen_lines.saturating_sub(count), MIN_SCREEN_LINES); + } + + /// Check if coordinates are inside the terminal 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.padding_x + self.columns as f32 * self.cell_width) as usize + && x > self.padding_x as usize + && y <= (self.padding_y + self.screen_lines as f32 * self.cell_height) as usize + && y > self.padding_y as usize + } + + /// 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. + } +} + +impl TermDimensions for SizeInfo { + #[inline] + fn columns(&self) -> usize { + self.columns + } + + #[inline] + fn screen_lines(&self) -> usize { + self.screen_lines + } + + #[inline] + fn total_lines(&self) -> usize { + self.screen_lines() + } +} + #[derive(Default, Clone, Debug, PartialEq)] pub struct DisplayUpdate { pub dirty: bool, @@ -456,7 +615,7 @@ impl Display { self.size_info.reserve_lines(message_bar_lines + search_lines); // Resize PTY. - pty_resize_handle.on_resize(&self.size_info); + pty_resize_handle.on_resize(self.size_info.into()); // Resize terminal. terminal.resize(self.size_info); diff --git a/alacritty/src/display/window.rs b/alacritty/src/display/window.rs index cf10f811..f098d7f8 100644 --- a/alacritty/src/display/window.rs +++ b/alacritty/src/display/window.rs @@ -50,10 +50,10 @@ use raw_window_handle::{HasRawWindowHandle, RawWindowHandle}; use winapi::shared::minwindef::WORD; use alacritty_terminal::index::Point; -use alacritty_terminal::term::SizeInfo; use crate::config::window::{Decorations, Identity, WindowConfig}; use crate::config::UiConfig; +use crate::display::SizeInfo; use crate::gl; /// Window icon for `_NET_WM_ICON` property. diff --git a/alacritty/src/event.rs b/alacritty/src/event.rs index b9a9b534..d32fd6e5 100644 --- a/alacritty/src/event.rs +++ b/alacritty/src/event.rs @@ -32,7 +32,7 @@ use alacritty_terminal::grid::{Dimensions, Scroll}; use alacritty_terminal::index::{Boundary, Column, Direction, Line, Point, Side}; use alacritty_terminal::selection::{Selection, SelectionType}; use alacritty_terminal::term::search::{Match, RegexSearch}; -use alacritty_terminal::term::{ClipboardType, SizeInfo, Term, TermMode}; +use alacritty_terminal::term::{ClipboardType, Term, TermMode}; use crate::cli::{Options as CliOptions, WindowOptions}; use crate::clipboard::Clipboard; @@ -43,7 +43,7 @@ use crate::daemon::foreground_process_path; use crate::daemon::spawn_daemon; use crate::display::hint::HintMatch; use crate::display::window::Window; -use crate::display::{self, Display}; +use crate::display::{self, Display, SizeInfo}; use crate::input::{self, ActionContext as _, FONT_SIZE_STEP}; use crate::message_bar::{Message, MessageBuffer}; use crate::scheduler::{Scheduler, TimerId, Topic}; @@ -1093,6 +1093,10 @@ impl input::Processor> { .unwrap_or(self.ctx.display.colors[index]); self.ctx.write_to_pty(format(color).into_bytes()); }, + TerminalEvent::TextAreaSizeRequest(format) => { + let text = format(self.ctx.size_info().into()); + self.ctx.write_to_pty(text.into_bytes()); + }, TerminalEvent::PtyWrite(text) => self.ctx.write_to_pty(text.into_bytes()), TerminalEvent::MouseCursorDirty => self.reset_mouse_cursor(), TerminalEvent::Exit => (), diff --git a/alacritty/src/input.rs b/alacritty/src/input.rs index 89f04c0c..16649327 100644 --- a/alacritty/src/input.rs +++ b/alacritty/src/input.rs @@ -27,14 +27,14 @@ use alacritty_terminal::grid::{Dimensions, Scroll}; use alacritty_terminal::index::{Boundary, Column, Direction, Point, Side}; use alacritty_terminal::selection::SelectionType; use alacritty_terminal::term::search::Match; -use alacritty_terminal::term::{ClipboardType, SizeInfo, Term, TermMode}; +use alacritty_terminal::term::{ClipboardType, Term, TermMode}; use alacritty_terminal::vi_mode::ViMotion; use crate::clipboard::Clipboard; use crate::config::{Action, BindingMode, Key, MouseAction, SearchAction, UiConfig, ViAction}; use crate::display::hint::HintMatch; use crate::display::window::Window; -use crate::display::Display; +use crate::display::{Display, SizeInfo}; use crate::event::{ClickState, Event, EventType, Mouse, TYPING_SEARCH_DELAY}; use crate::message_bar::{self, Message}; use crate::scheduler::{Scheduler, TimerId, Topic}; @@ -1110,7 +1110,7 @@ mod tests { false, ); - let mut terminal = Term::new(&cfg.terminal_config, size, MockEventProxy); + let mut terminal = Term::new(&cfg.terminal_config, &size, MockEventProxy); let mut mouse = Mouse { click_state: $initial_state, diff --git a/alacritty/src/message_bar.rs b/alacritty/src/message_bar.rs index a0c821ae..988a6a31 100644 --- a/alacritty/src/message_bar.rs +++ b/alacritty/src/message_bar.rs @@ -3,7 +3,8 @@ use std::collections::VecDeque; use unicode_width::UnicodeWidthChar; use alacritty_terminal::grid::Dimensions; -use alacritty_terminal::term::SizeInfo; + +use crate::display::SizeInfo; pub const CLOSE_BUTTON_TEXT: &str = "[X]"; const CLOSE_BUTTON_PADDING: usize = 1; @@ -186,7 +187,7 @@ impl MessageBuffer { mod tests { use super::*; - use alacritty_terminal::term::SizeInfo; + use crate::display::SizeInfo; #[test] fn appends_close_button() { diff --git a/alacritty/src/renderer/mod.rs b/alacritty/src/renderer/mod.rs index 4a75416b..0446379e 100644 --- a/alacritty/src/renderer/mod.rs +++ b/alacritty/src/renderer/mod.rs @@ -7,9 +7,9 @@ use log::info; use alacritty_terminal::index::Point; use alacritty_terminal::term::cell::Flags; use alacritty_terminal::term::color::Rgb; -use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCell; +use crate::display::SizeInfo; use crate::gl; use crate::renderer::rects::{RectRenderer, RenderRect}; use crate::renderer::shader::ShaderError; diff --git a/alacritty/src/renderer/rects.rs b/alacritty/src/renderer/rects.rs index 27e306be..73ca2c94 100644 --- a/alacritty/src/renderer/rects.rs +++ b/alacritty/src/renderer/rects.rs @@ -7,9 +7,9 @@ use alacritty_terminal::grid::Dimensions; use alacritty_terminal::index::{Column, Point}; use alacritty_terminal::term::cell::Flags; use alacritty_terminal::term::color::Rgb; -use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCell; +use crate::display::SizeInfo; use crate::gl; use crate::gl::types::*; use crate::renderer::shader::{ShaderError, ShaderProgram, ShaderVersion}; diff --git a/alacritty/src/renderer/text/gles2.rs b/alacritty/src/renderer/text/gles2.rs index 9b161081..4d8347bf 100644 --- a/alacritty/src/renderer/text/gles2.rs +++ b/alacritty/src/renderer/text/gles2.rs @@ -5,9 +5,9 @@ use crossfont::RasterizedGlyph; use log::info; use alacritty_terminal::term::cell::Flags; -use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCell; +use crate::display::SizeInfo; use crate::gl; use crate::gl::types::*; use crate::renderer::shader::{ShaderProgram, ShaderVersion}; diff --git a/alacritty/src/renderer/text/glsl3.rs b/alacritty/src/renderer/text/glsl3.rs index 6701cf3d..917a5fb5 100644 --- a/alacritty/src/renderer/text/glsl3.rs +++ b/alacritty/src/renderer/text/glsl3.rs @@ -5,9 +5,9 @@ use crossfont::RasterizedGlyph; use log::info; use alacritty_terminal::term::cell::Flags; -use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCell; +use crate::display::SizeInfo; use crate::gl; use crate::gl::types::*; use crate::renderer::shader::{ShaderProgram, ShaderVersion}; diff --git a/alacritty/src/renderer/text/mod.rs b/alacritty/src/renderer/text/mod.rs index 05ac59e8..a032ffc7 100644 --- a/alacritty/src/renderer/text/mod.rs +++ b/alacritty/src/renderer/text/mod.rs @@ -2,9 +2,9 @@ use bitflags::bitflags; use crossfont::{GlyphKey, RasterizedGlyph}; use alacritty_terminal::term::cell::Flags; -use alacritty_terminal::term::SizeInfo; use crate::display::content::RenderableCell; +use crate::display::SizeInfo; use crate::gl; use crate::gl::types::*; diff --git a/alacritty/src/window_context.rs b/alacritty/src/window_context.rs index c9b27ed6..6ead6e4e 100644 --- a/alacritty/src/window_context.rs +++ b/alacritty/src/window_context.rs @@ -24,6 +24,7 @@ use alacritty_terminal::event_loop::{EventLoop as PtyEventLoop, Msg, Notifier}; use alacritty_terminal::grid::{Dimensions, Scroll}; use alacritty_terminal::index::Direction; use alacritty_terminal::sync::FairMutex; +use alacritty_terminal::term::test::TermSize; use alacritty_terminal::term::{Term, TermMode}; use alacritty_terminal::tty; @@ -98,7 +99,7 @@ impl WindowContext { // This object contains all of the state about what's being displayed. It's // wrapped in a clonable mutex since both the I/O loop and display need to // access it. - let terminal = Term::new(&config.terminal_config, display.size_info, event_proxy.clone()); + let terminal = Term::new(&config.terminal_config, &display.size_info, event_proxy.clone()); let terminal = Arc::new(FairMutex::new(terminal)); // Create the PTY. @@ -106,7 +107,7 @@ impl WindowContext { // The PTY forks a process to run the shell on the slave side of the // pseudoterminal. A file descriptor for the master side is retained for // reading/writing to the shell. - let pty = tty::new(&pty_config, &display.size_info, display.window.x11_window_id())?; + let pty = tty::new(&pty_config, display.size_info.into(), display.window.x11_window_id())?; #[cfg(not(windows))] let master_fd = pty.file().as_raw_fd(); @@ -350,7 +351,9 @@ impl WindowContext { let serialized_grid = json::to_string(&grid).expect("serialize grid"); - let serialized_size = json::to_string(&self.display.size_info).expect("serialize size"); + let size_info = &self.display.size_info; + let size = TermSize::new(size_info.columns(), size_info.screen_lines()); + let serialized_size = json::to_string(&size).expect("serialize size"); let serialized_config = format!("{{\"history_size\":{}}}", grid.history_size()); diff --git a/alacritty_terminal/src/event.rs b/alacritty_terminal/src/event.rs index 1ddf820b..9e5031a0 100644 --- a/alacritty_terminal/src/event.rs +++ b/alacritty_terminal/src/event.rs @@ -3,7 +3,7 @@ use std::fmt::{self, Debug, Formatter}; use std::sync::Arc; use crate::term::color::Rgb; -use crate::term::{ClipboardType, SizeInfo}; +use crate::term::ClipboardType; /// Terminal event. /// @@ -38,6 +38,9 @@ pub enum Event { /// Write some text to the PTY. PtyWrite(String), + /// Request to write the text area size. + TextAreaSizeRequest(Arc String + Sync + Send + 'static>), + /// Cursor blinking state has changed. CursorBlinkingChange, @@ -56,6 +59,7 @@ impl Debug for Event { match self { Event::ClipboardStore(ty, text) => write!(f, "ClipboardStore({:?}, {})", ty, text), Event::ClipboardLoad(ty, _) => write!(f, "ClipboardLoad({:?})", ty), + Event::TextAreaSizeRequest(_) => write!(f, "TextAreaSizeRequest"), Event::ColorRequest(index, _) => write!(f, "ColorRequest({})", index), Event::PtyWrite(text) => write!(f, "PtyWrite({})", text), Event::Title(title) => write!(f, "Title({})", title), @@ -77,9 +81,17 @@ pub trait Notify { fn notify>>(&self, _: B); } +#[derive(Copy, Clone, Debug)] +pub struct WindowSize { + pub num_lines: u16, + pub num_cols: u16, + pub cell_width: u16, + pub cell_height: u16, +} + /// Types that are interested in when the display is resized. pub trait OnResize { - fn on_resize(&mut self, size: &SizeInfo); + fn on_resize(&mut self, window_size: WindowSize); } /// Event Loop for notifying the renderer about terminal events. diff --git a/alacritty_terminal/src/event_loop.rs b/alacritty_terminal/src/event_loop.rs index 113efc1a..3f10f66f 100644 --- a/alacritty_terminal/src/event_loop.rs +++ b/alacritty_terminal/src/event_loop.rs @@ -15,9 +15,9 @@ use mio::unix::UnixReady; use mio::{self, Events, PollOpt, Ready}; use mio_extras::channel::{self, Receiver, Sender}; -use crate::event::{self, Event, EventListener}; +use crate::event::{self, Event, EventListener, WindowSize}; use crate::sync::FairMutex; -use crate::term::{SizeInfo, Term}; +use crate::term::Term; use crate::{ansi, thread, tty}; /// Max bytes to read from the PTY before forced terminal synchronization. @@ -36,7 +36,7 @@ pub enum Msg { Shutdown, /// Instruction to resize the PTY. - Resize(SizeInfo), + Resize(WindowSize), } /// The main event!.. loop. @@ -78,8 +78,8 @@ impl event::Notify for Notifier { } impl event::OnResize for Notifier { - fn on_resize(&mut self, size: &SizeInfo) { - let _ = self.0.send(Msg::Resize(*size)); + fn on_resize(&mut self, window_size: WindowSize) { + let _ = self.0.send(Msg::Resize(window_size)); } } @@ -182,7 +182,7 @@ where while let Ok(msg) = self.rx.try_recv() { match msg { Msg::Input(input) => state.write_list.push_back(input), - Msg::Resize(size) => self.pty.on_resize(&size), + Msg::Resize(window_size) => self.pty.on_resize(window_size), Msg::Shutdown => return false, } } diff --git a/alacritty_terminal/src/selection.rs b/alacritty_terminal/src/selection.rs index 669db6a2..09880c77 100644 --- a/alacritty_terminal/src/selection.rs +++ b/alacritty_terminal/src/selection.rs @@ -397,11 +397,12 @@ mod tests { use crate::config::Config; use crate::index::{Column, Point, Side}; - use crate::term::{SizeInfo, Term}; + use crate::term::test::TermSize; + use crate::term::Term; fn term(height: usize, width: usize) -> Term<()> { - let size = SizeInfo::new(width as f32, height as f32, 1.0, 1.0, 0.0, 0.0, false); - Term::new(&Config::default(), size, ()) + let size = TermSize::new(width, height); + Term::new(&Config::default(), &size, ()) } /// Test case of single cell selection. diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index 14dd306e..ffb4a1e8 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -6,7 +6,6 @@ use std::{cmp, mem, ptr, slice, str}; use bitflags::bitflags; use log::{debug, trace}; -use serde::{Deserialize, Serialize}; use unicode_width::UnicodeWidthChar; use crate::ansi::{ @@ -74,155 +73,6 @@ impl Default for TermMode { } } -/// Terminal size info. -#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq)] -pub struct SizeInfo { - /// Terminal window width. - width: T, - - /// Terminal window height. - height: T, - - /// Width of individual cell. - cell_width: T, - - /// Height of individual cell. - cell_height: T, - - /// Horizontal window padding. - padding_x: T, - - /// Vertical window padding. - padding_y: T, - - /// Number of lines in the viewport. - screen_lines: usize, - - /// Number of columns in the viewport. - columns: usize, -} - -impl From> for SizeInfo { - fn from(size_info: SizeInfo) -> Self { - Self { - width: size_info.width as u32, - height: size_info.height as u32, - cell_width: size_info.cell_width as u32, - cell_height: size_info.cell_height as u32, - padding_x: size_info.padding_x as u32, - padding_y: size_info.padding_y as u32, - screen_lines: size_info.screen_lines, - columns: size_info.screen_lines, - } - } -} - -impl SizeInfo { - #[inline] - pub fn width(&self) -> T { - self.width - } - - #[inline] - pub fn height(&self) -> T { - self.height - } - - #[inline] - pub fn cell_width(&self) -> T { - self.cell_width - } - - #[inline] - pub fn cell_height(&self) -> T { - self.cell_height - } - - #[inline] - pub fn padding_x(&self) -> T { - self.padding_x - } - - #[inline] - pub fn padding_y(&self) -> T { - self.padding_y - } -} - -impl SizeInfo { - #[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); - } - - let lines = (height - 2. * padding_y) / cell_height; - let screen_lines = cmp::max(lines as usize, MIN_SCREEN_LINES); - - let columns = (width - 2. * padding_x) / cell_width; - let columns = cmp::max(columns as usize, MIN_COLUMNS); - - SizeInfo { - width, - height, - cell_width, - cell_height, - padding_x: padding_x.floor(), - padding_y: padding_y.floor(), - screen_lines, - columns, - } - } - - #[inline] - pub fn reserve_lines(&mut self, count: usize) { - self.screen_lines = cmp::max(self.screen_lines.saturating_sub(count), MIN_SCREEN_LINES); - } - - /// Check if coordinates are inside the terminal 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.padding_x + self.columns as f32 * self.cell_width) as usize - && x > self.padding_x as usize - && y <= (self.padding_y + self.screen_lines as f32 * self.cell_height) as usize - && y > self.padding_y as usize - } - - /// 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. - } -} - -impl Dimensions for SizeInfo { - #[inline] - fn columns(&self) -> usize { - self.columns - } - - #[inline] - fn screen_lines(&self) -> usize { - self.screen_lines - } - - #[inline] - fn total_lines(&self) -> usize { - self.screen_lines() - } -} - #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub struct LineDamageBounds { /// Damaged line number. @@ -431,10 +281,6 @@ pub struct Term { /// term is set. title_stack: Vec>, - /// Information about cell dimensions. - cell_width: usize, - cell_height: usize, - /// Information about damaged cells. damage: TermDamageState, } @@ -462,9 +308,9 @@ impl Term { } } - pub fn new(config: &Config, size: SizeInfo, event_proxy: T) -> Term { - let num_cols = size.columns; - let num_lines = size.screen_lines; + pub fn new(config: &Config, dimensions: &D, event_proxy: T) -> Term { + let num_cols = dimensions.columns(); + let num_lines = dimensions.screen_lines(); let history_size = config.scrolling.history() as usize; let grid = Grid::new(num_lines, num_cols, history_size); @@ -495,8 +341,6 @@ impl Term { title: None, title_stack: Vec::new(), selection: None, - cell_width: size.cell_width as usize, - cell_height: size.cell_height as usize, damage, } } @@ -717,15 +561,12 @@ impl Term { } /// Resize terminal to new dimensions. - pub fn resize(&mut self, size: SizeInfo) { - self.cell_width = size.cell_width as usize; - self.cell_height = size.cell_height as usize; - + pub fn resize(&mut self, size: S) { let old_cols = self.columns(); let old_lines = self.screen_lines(); - let num_cols = size.columns; - let num_lines = size.screen_lines; + let num_cols = size.columns(); + let num_lines = size.screen_lines(); if old_cols == num_cols && old_lines == num_lines { debug!("Term::resize dimensions unchanged"); @@ -2077,10 +1918,11 @@ impl Handler for Term { #[inline] fn text_area_size_pixels(&mut self) { - let width = self.cell_width * self.columns(); - let height = self.cell_height * self.screen_lines(); - let text = format!("\x1b[4;{};{}t", height, width); - self.event_proxy.send_event(Event::PtyWrite(text)); + self.event_proxy.send_event(Event::TextAreaSizeRequest(Arc::new(move |window_size| { + let height = window_size.num_lines * window_size.cell_height; + let width = window_size.num_cols * window_size.cell_width; + format!("\x1b[4;{};{}t", height, width) + }))); } #[inline] @@ -2217,11 +2059,38 @@ impl<'a> RenderableContent<'a> { pub mod test { use super::*; + use serde::{Deserialize, Serialize}; use unicode_width::UnicodeWidthChar; use crate::config::Config; use crate::index::Column; + #[derive(Serialize, Deserialize)] + pub struct TermSize { + pub columns: usize, + pub screen_lines: usize, + } + + impl TermSize { + pub fn new(columns: usize, screen_lines: usize) -> Self { + Self { columns, screen_lines } + } + } + + impl Dimensions for TermSize { + fn total_lines(&self) -> usize { + self.screen_lines() + } + + fn screen_lines(&self) -> usize { + self.screen_lines + } + + fn columns(&self) -> usize { + self.columns + } + } + /// Construct a terminal from its content as string. /// /// A `\n` will break line and `\r\n` will break line without wrapping. @@ -2250,8 +2119,8 @@ pub mod test { .unwrap_or(0); // Create terminal with the appropriate dimensions. - 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, ()); + let size = TermSize::new(num_cols, lines.len()); + let mut term = Term::new(&Config::default(), &size, ()); // Fill terminal with content. for (line, text) in lines.iter().enumerate() { @@ -2291,11 +2160,12 @@ mod tests { use crate::index::{Column, Point, Side}; use crate::selection::{Selection, SelectionType}; use crate::term::cell::{Cell, Flags}; + use crate::term::test::TermSize; #[test] fn scroll_display_page_up() { - let size = SizeInfo::new(5., 10., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 11 lines of scrollback. for _ in 0..20 { @@ -2320,8 +2190,8 @@ mod tests { #[test] fn scroll_display_page_down() { - let size = SizeInfo::new(5., 10., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 11 lines of scrollback. for _ in 0..20 { @@ -2350,8 +2220,8 @@ mod tests { #[test] fn simple_selection_works() { - let size = SizeInfo::new(5., 5., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 5); + let mut term = Term::new(&Config::default(), &size, ()); let grid = term.grid_mut(); for i in 0..4 { if i == 1 { @@ -2396,8 +2266,8 @@ mod tests { #[test] fn semantic_selection_works() { - let size = SizeInfo::new(5., 3., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 3); + let mut term = Term::new(&Config::default(), &size, ()); let mut grid: Grid = Grid::new(3, 5, 0); for i in 0..5 { for j in 0..2 { @@ -2444,8 +2314,8 @@ mod tests { #[test] fn line_selection_works() { - let size = SizeInfo::new(5., 1., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 1); + let mut term = Term::new(&Config::default(), &size, ()); let mut grid: Grid = Grid::new(1, 5, 0); for i in 0..5 { grid[Line(0)][Column(i)].c = 'a'; @@ -2465,8 +2335,8 @@ mod tests { #[test] fn block_selection_works() { - let size = SizeInfo::new(5., 5., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 5); + let mut term = Term::new(&Config::default(), &size, ()); let grid = term.grid_mut(); for i in 1..4 { grid[Line(i)][Column(0)].c = '"'; @@ -2521,8 +2391,8 @@ mod tests { #[test] fn input_line_drawing_character() { - let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(7, 17); + let mut term = Term::new(&Config::default(), &size, ()); let cursor = Point::new(Line(0), Column(0)); term.configure_charset(CharsetIndex::G0, StandardCharset::SpecialCharacterAndLineDrawing); term.input('a'); @@ -2532,8 +2402,8 @@ mod tests { #[test] fn clearing_viewport_keeps_history_position() { - let size = SizeInfo::new(10.0, 20.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 20); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..29 { @@ -2553,8 +2423,8 @@ mod tests { #[test] fn clearing_viewport_with_vi_mode_keeps_history_position() { - let size = SizeInfo::new(10.0, 20.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 20); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..29 { @@ -2579,8 +2449,8 @@ mod tests { #[test] fn clearing_scrollback_resets_display_offset() { - let size = SizeInfo::new(10.0, 20.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 20); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..29 { @@ -2600,8 +2470,8 @@ mod tests { #[test] fn clearing_scrollback_sets_vi_cursor_into_viewport() { - let size = SizeInfo::new(10.0, 20.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 20); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..29 { @@ -2626,8 +2496,8 @@ mod tests { #[test] fn clear_saved_lines() { - let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(7, 17); + let mut term = Term::new(&Config::default(), &size, ()); // Add one line of scrollback. term.grid.scroll_up(&(Line(0)..Line(1)), 1); @@ -2648,8 +2518,8 @@ mod tests { #[test] fn vi_cursor_keep_pos_on_scrollback_buffer() { - let size = SizeInfo::new(5., 10., 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(5, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 11 lines of scrollback. for _ in 0..20 { @@ -2668,8 +2538,8 @@ mod tests { #[test] fn grow_lines_updates_active_cursor_pos() { - let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let mut size = TermSize::new(100, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..19 { @@ -2688,8 +2558,8 @@ mod tests { #[test] fn grow_lines_updates_inactive_cursor_pos() { - let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let mut size = TermSize::new(100, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..19 { @@ -2714,8 +2584,8 @@ mod tests { #[test] fn shrink_lines_updates_active_cursor_pos() { - let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let mut size = TermSize::new(100, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..19 { @@ -2734,8 +2604,8 @@ mod tests { #[test] fn shrink_lines_updates_inactive_cursor_pos() { - let mut size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let mut size = TermSize::new(100, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Create 10 lines of scrollback. for _ in 0..19 { @@ -2760,8 +2630,8 @@ mod tests { #[test] fn damage_public_usage() { - let size = SizeInfo::new(10.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 10); + let mut term = Term::new(&Config::default(), &size, ()); // Reset terminal for partial damage tests since it's initialized as fully damaged. term.reset_damage(); @@ -2840,8 +2710,8 @@ mod tests { #[test] fn damage_cursor_movements() { - let size = SizeInfo::new(10.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 10); + let mut term = Term::new(&Config::default(), &size, ()); let num_cols = term.columns(); // Reset terminal for partial damage tests since it's initialized as fully damaged. term.reset_damage(); @@ -2938,8 +2808,8 @@ mod tests { #[test] fn damage_vi_movements() { - let size = SizeInfo::new(10.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(10, 10); + let mut term = Term::new(&Config::default(), &size, ()); let num_cols = term.columns(); // Reset terminal for partial damage tests since it's initialized as fully damaged. term.reset_damage(); @@ -2970,8 +2840,8 @@ mod tests { #[test] fn full_damage() { - let size = SizeInfo::new(100.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(100, 10); + let mut term = Term::new(&Config::default(), &size, ()); assert!(term.damage.is_fully_damaged); for _ in 0..20 { @@ -3049,15 +2919,15 @@ mod tests { assert!(term.damage.is_fully_damaged); term.reset_damage(); - let size = SizeInfo::new(10.0, 10.0, 1.0, 1.0, 0.0, 0.0, false); + let size = TermSize::new(10, 10); term.resize(size); assert!(term.damage.is_fully_damaged); } #[test] fn window_title() { - let size = SizeInfo::new(21.0, 51.0, 3.0, 3.0, 0.0, 0.0, false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(7, 17); + let mut term = Term::new(&Config::default(), &size, ()); // Title None by default. assert_eq!(term.title, None); diff --git a/alacritty_terminal/src/term/search.rs b/alacritty_terminal/src/term/search.rs index e34fd1b4..5ee2cdce 100644 --- a/alacritty_terminal/src/term/search.rs +++ b/alacritty_terminal/src/term/search.rs @@ -510,8 +510,7 @@ mod tests { use crate::config::Config; use crate::index::{Column, Line}; - use crate::term::test::mock_term; - use crate::term::SizeInfo; + use crate::term::test::{mock_term, TermSize}; #[test] fn regex_right() { @@ -810,8 +809,8 @@ mod tests { #[test] fn wide_without_spacer() { - let size = SizeInfo::new(2., 2., 1., 1., 0., 0., false); - let mut term = Term::new(&Config::default(), size, ()); + let size = TermSize::new(2, 2); + let mut term = Term::new(&Config::default(), &size, ()); term.grid[Line(0)][Column(0)].c = 'x'; term.grid[Line(0)][Column(1)].c = '字'; term.grid[Line(0)][Column(1)].flags = Flags::WIDE_CHAR; diff --git a/alacritty_terminal/src/tty/unix.rs b/alacritty_terminal/src/tty/unix.rs index 206dbe8d..2bb5e973 100644 --- a/alacritty_terminal/src/tty/unix.rs +++ b/alacritty_terminal/src/tty/unix.rs @@ -22,9 +22,7 @@ use signal_hook::consts as sigconsts; use signal_hook_mio::v0_6::Signals; use crate::config::{Program, PtyConfig}; -use crate::event::OnResize; -use crate::grid::Dimensions; -use crate::term::SizeInfo; +use crate::event::{OnResize, WindowSize}; use crate::tty::{ChildEvent, EventedPty, EventedReadWrite}; macro_rules! die { @@ -36,11 +34,11 @@ macro_rules! die { /// Get raw fds for master/slave ends of a new PTY. fn make_pty(size: winsize) -> (RawFd, RawFd) { - let mut win_size = size; - win_size.ws_xpixel = 0; - win_size.ws_ypixel = 0; + let mut window_size = size; + window_size.ws_xpixel = 0; + window_size.ws_ypixel = 0; - let ends = openpty(Some(&win_size), None).expect("openpty failed"); + let ends = openpty(Some(&window_size), None).expect("openpty failed"); (ends.master, ends.slave) } @@ -137,8 +135,8 @@ fn default_shell(pw: &Passwd<'_>) -> Program { } /// Create a new TTY and return a handle to interact with it. -pub fn new(config: &PtyConfig, size: &SizeInfo, window_id: Option) -> Result { - let (master, slave) = make_pty(size.to_winsize()); +pub fn new(config: &PtyConfig, window_size: WindowSize, window_id: Option) -> Result { + let (master, slave) = make_pty(window_size.to_winsize()); #[cfg(any(target_os = "linux", target_os = "macos"))] if let Ok(mut termios) = termios::tcgetattr(master) { @@ -229,7 +227,7 @@ pub fn new(config: &PtyConfig, size: &SizeInfo, window_id: Option) -> Res signals, signals_token: mio::Token::from(0), }; - pty.on_resize(size); + pty.on_resize(window_size); Ok(pty) }, Err(err) => Err(Error::new( @@ -347,8 +345,8 @@ impl OnResize for Pty { /// /// Tells the kernel that the window size changed with the new pixel /// dimensions and line/column counts. - fn on_resize(&mut self, size: &SizeInfo) { - let win = size.to_winsize(); + fn on_resize(&mut self, window_size: WindowSize) { + let win = window_size.to_winsize(); let res = unsafe { libc::ioctl(self.file.as_raw_fd(), libc::TIOCSWINSZ, &win as *const _) }; @@ -361,17 +359,17 @@ impl OnResize for Pty { /// Types that can produce a `libc::winsize`. pub trait ToWinsize { /// Get a `libc::winsize`. - fn to_winsize(&self) -> winsize; + fn to_winsize(self) -> winsize; } -impl<'a> ToWinsize for &'a SizeInfo { - fn to_winsize(&self) -> winsize { - winsize { - ws_row: self.screen_lines() as libc::c_ushort, - ws_col: self.columns() as libc::c_ushort, - ws_xpixel: self.width() as libc::c_ushort, - ws_ypixel: self.height() as libc::c_ushort, - } +impl ToWinsize for WindowSize { + fn to_winsize(self) -> winsize { + let ws_row = self.num_lines as libc::c_ushort; + let ws_col = self.num_cols as libc::c_ushort; + + let ws_xpixel = ws_col * self.cell_width as libc::c_ushort; + let ws_ypixel = ws_row * self.cell_height as libc::c_ushort; + winsize { ws_row, ws_col, ws_xpixel, ws_ypixel } } } diff --git a/alacritty_terminal/src/tty/windows/conpty.rs b/alacritty_terminal/src/tty/windows/conpty.rs index 9556be8b..e856a1b1 100644 --- a/alacritty_terminal/src/tty/windows/conpty.rs +++ b/alacritty_terminal/src/tty/windows/conpty.rs @@ -1,6 +1,6 @@ use std::io::Error; use std::os::windows::io::IntoRawHandle; -use std::{i16, mem, ptr}; +use std::{mem, ptr}; use mio_anonymous_pipes::{EventedAnonRead, EventedAnonWrite}; use winapi::shared::basetsd::{PSIZE_T, SIZE_T}; @@ -16,9 +16,7 @@ use winapi::um::winbase::{EXTENDED_STARTUPINFO_PRESENT, STARTF_USESTDHANDLES, ST use winapi::um::wincontypes::{COORD, HPCON}; use crate::config::PtyConfig; -use crate::event::OnResize; -use crate::grid::Dimensions; -use crate::term::SizeInfo; +use crate::event::{OnResize, WindowSize}; use crate::tty::windows::child::ChildExitWatcher; use crate::tty::windows::{cmdline, win32_string, Pty}; @@ -40,7 +38,7 @@ impl Drop for Conpty { // The ConPTY handle can be sent between threads. unsafe impl Send for Conpty {} -pub fn new(config: &PtyConfig, size: &SizeInfo) -> Option { +pub fn new(config: &PtyConfig, window_size: WindowSize) -> Option { let mut pty_handle = 0 as HPCON; // Passing 0 as the size parameter allows the "system default" buffer @@ -50,13 +48,10 @@ pub fn new(config: &PtyConfig, size: &SizeInfo) -> Option { let (conout, conout_pty_handle) = miow::pipe::anonymous(0).unwrap(); let (conin_pty_handle, conin) = miow::pipe::anonymous(0).unwrap(); - let coord = - coord_from_sizeinfo(size).expect("Overflow when creating initial size on pseudoconsole"); - // Create the Pseudo Console, using the pipes. let result = unsafe { CreatePseudoConsole( - coord, + window_size.into(), conin_pty_handle.into_raw_handle(), conout_pty_handle.into_raw_handle(), 0, @@ -174,22 +169,16 @@ fn panic_shell_spawn() { } impl OnResize for Conpty { - fn on_resize(&mut self, sizeinfo: &SizeInfo) { - if let Some(coord) = coord_from_sizeinfo(sizeinfo) { - let result = unsafe { ResizePseudoConsole(self.handle, coord) }; - assert_eq!(result, S_OK); - } + fn on_resize(&mut self, window_size: WindowSize) { + let result = unsafe { ResizePseudoConsole(self.handle, window_size.into()) }; + assert_eq!(result, S_OK); } } -/// Helper to build a COORD from a SizeInfo, returning None in overflow cases. -fn coord_from_sizeinfo(size: &SizeInfo) -> Option { - let lines = size.screen_lines(); - let columns = size.columns(); - - if columns <= i16::MAX as usize && lines <= i16::MAX as usize { - Some(COORD { X: columns as i16, Y: lines as i16 }) - } else { - None +impl From for COORD { + fn from(window_size: WindowSize) -> Self { + let lines = window_size.num_lines; + let columns = window_size.num_cols; + COORD { X: columns as i16, Y: lines as i16 } } } diff --git a/alacritty_terminal/src/tty/windows/mod.rs b/alacritty_terminal/src/tty/windows/mod.rs index 0cc6a8bc..aa21ce14 100644 --- a/alacritty_terminal/src/tty/windows/mod.rs +++ b/alacritty_terminal/src/tty/windows/mod.rs @@ -5,8 +5,7 @@ use std::os::windows::ffi::OsStrExt; use std::sync::mpsc::TryRecvError; use crate::config::{Program, PtyConfig}; -use crate::event::OnResize; -use crate::term::SizeInfo; +use crate::event::{OnResize, WindowSize}; use crate::tty::windows::child::ChildExitWatcher; use crate::tty::{ChildEvent, EventedPty, EventedReadWrite}; @@ -28,8 +27,9 @@ pub struct Pty { child_watcher: ChildExitWatcher, } -pub fn new(config: &PtyConfig, size: &SizeInfo, _window_id: Option) -> Result { - conpty::new(config, size).ok_or_else(|| Error::new(ErrorKind::Other, "failed to spawn conpty")) +pub fn new(config: &PtyConfig, window_size: WindowSize, _window_id: Option) -> Result { + conpty::new(config, window_size) + .ok_or_else(|| Error::new(ErrorKind::Other, "failed to spawn conpty")) } impl Pty { @@ -160,8 +160,8 @@ impl EventedPty for Pty { } impl OnResize for Pty { - fn on_resize(&mut self, size: &SizeInfo) { - self.backend.on_resize(size) + fn on_resize(&mut self, window_size: WindowSize) { + self.backend.on_resize(window_size) } } diff --git a/alacritty_terminal/src/vi_mode.rs b/alacritty_terminal/src/vi_mode.rs index 8a77b760..7f1d40ee 100644 --- a/alacritty_terminal/src/vi_mode.rs +++ b/alacritty_terminal/src/vi_mode.rs @@ -381,11 +381,12 @@ mod tests { use crate::ansi::Handler; use crate::config::Config; use crate::index::{Column, Line}; - use crate::term::{SizeInfo, Term}; + use crate::term::test::TermSize; + use crate::term::Term; fn term() -> Term<()> { - let size = SizeInfo::new(20., 20., 1.0, 1.0, 0.0, 0.0, false); - Term::new(&Config::default(), size, ()) + let size = TermSize::new(20, 20); + Term::new(&Config::default(), &size, ()) } #[test] diff --git a/alacritty_terminal/tests/ref.rs b/alacritty_terminal/tests/ref.rs index 87f5a811..6f9d39d0 100644 --- a/alacritty_terminal/tests/ref.rs +++ b/alacritty_terminal/tests/ref.rs @@ -11,7 +11,8 @@ use alacritty_terminal::event::{Event, EventListener}; use alacritty_terminal::grid::{Dimensions, Grid}; use alacritty_terminal::index::{Column, Line}; use alacritty_terminal::term::cell::Cell; -use alacritty_terminal::term::{SizeInfo, Term}; +use alacritty_terminal::term::test::TermSize; +use alacritty_terminal::term::Term; macro_rules! ref_tests { ($($name:ident)*) => { @@ -98,14 +99,14 @@ fn ref_test(dir: &Path) { let serialized_grid = fs::read_to_string(dir.join("grid.json")).unwrap(); let serialized_cfg = fs::read_to_string(dir.join("config.json")).unwrap(); - let size: SizeInfo = json::from_str(&serialized_size).unwrap(); + let size: TermSize = json::from_str(&serialized_size).unwrap(); let grid: Grid = json::from_str(&serialized_grid).unwrap(); let ref_config: RefConfig = json::from_str(&serialized_cfg).unwrap(); let mut config = Config::default(); config.scrolling.set_history(ref_config.history_size); - let mut terminal = Term::new(&config, size, Mock); + let mut terminal = Term::new(&config, &size, Mock); let mut parser = ansi::Processor::new(); for byte in recording { diff --git a/alacritty_terminal/tests/ref/alt_reset/size.json b/alacritty_terminal/tests/ref/alt_reset/size.json index e1496c9f..d75e8ead 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,"columns":106,"screen_lines":30} +{"columns":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 7a64bf41..08c6c865 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,"columns":66,"screen_lines":32} +{"columns":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 d9aec879..324a6e92 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,"columns":116,"screen_lines":63} +{"columns":116,"screen_lines":63} diff --git a/alacritty_terminal/tests/ref/colored_underline/size.json b/alacritty_terminal/tests/ref/colored_underline/size.json index 2902195f..ad1a4ad5 100644 --- a/alacritty_terminal/tests/ref/colored_underline/size.json +++ b/alacritty_terminal/tests/ref/colored_underline/size.json @@ -1 +1 @@ -{"width":1262.0,"height":690.0,"cell_width":9.0,"cell_height":18.0,"padding_x":0.0,"padding_y":0.0,"screen_lines":38,"columns":140} \ No newline at end of file +{"screen_lines":38,"columns":140} diff --git a/alacritty_terminal/tests/ref/csi_rep/size.json b/alacritty_terminal/tests/ref/csi_rep/size.json index 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 e1496c9f..d75e8ead 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,"columns":106,"screen_lines":30} +{"columns":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 e1496c9f..d75e8ead 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,"columns":106,"screen_lines":30} +{"columns":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 e1496c9f..d75e8ead 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,"columns":106,"screen_lines":30} +{"columns":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 5b5891b0..a6ad2842 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,"columns":116,"screen_lines":31} +{"columns":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 e1496c9f..d75e8ead 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,"columns":106,"screen_lines":30} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":105,"screen_lines":29} diff --git a/alacritty_terminal/tests/ref/history/size.json b/alacritty_terminal/tests/ref/history/size.json index 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 e1496c9f..d75e8ead 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,"columns":106,"screen_lines":30} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":105,"screen_lines":29} diff --git a/alacritty_terminal/tests/ref/ll/size.json b/alacritty_terminal/tests/ref/ll/size.json index 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 5b5891b0..a6ad2842 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,"columns":116,"screen_lines":31} +{"columns":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 eb2f8c6b..131aab99 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,"columns":172,"screen_lines":47} +{"columns":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 8fbe36f3..07f7f38d 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,"columns":139,"screen_lines":35} +{"columns":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 8fbe36f3..07f7f38d 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,"columns":139,"screen_lines":35} +{"columns":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 7b4c5e96..19a25007 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,"columns":102,"screen_lines":29} +{"columns":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 ca988096..2f7763b2 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,"columns":10,"screen_lines":3} +{"columns":10,"screen_lines":3} diff --git a/alacritty_terminal/tests/ref/sgr/size.json b/alacritty_terminal/tests/ref/sgr/size.json index 8fbe36f3..07f7f38d 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,"columns":139,"screen_lines":35} +{"columns":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 d9aec879..324a6e92 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,"columns":116,"screen_lines":63} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":105,"screen_lines":29} diff --git a/alacritty_terminal/tests/ref/underline/size.json b/alacritty_terminal/tests/ref/underline/size.json index 83bde809..fe33fdb1 100644 --- a/alacritty_terminal/tests/ref/underline/size.json +++ b/alacritty_terminal/tests/ref/underline/size.json @@ -1 +1 @@ -{"width":948.0,"height":1041.0,"cell_width":7.0,"cell_height":16.0,"padding_x":5.0,"padding_y":8.0,"screen_lines":64,"columns":134} \ No newline at end of file +{"screen_lines":64,"columns":134} diff --git a/alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json b/alacritty_terminal/tests/ref/vim_24bitcolors_bce/size.json index 25b171ec..b7bf301a 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,"columns":174,"screen_lines":96} +{"columns":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 eb2f8c6b..131aab99 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,"columns":172,"screen_lines":47} +{"columns":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 6e300ab3..e6445562 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,"columns":80,"screen_lines":24} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":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 5b5891b0..a6ad2842 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,"columns":116,"screen_lines":31} +{"columns":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 8fbe36f3..07f7f38d 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,"columns":139,"screen_lines":35} +{"columns":139,"screen_lines":35} diff --git a/alacritty_terminal/tests/ref/zerowidth/size.json b/alacritty_terminal/tests/ref/zerowidth/size.json index e98968f5..63ae9395 100644 --- a/alacritty_terminal/tests/ref/zerowidth/size.json +++ b/alacritty_terminal/tests/ref/zerowidth/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,"screen_lines":35,"columns":139} \ No newline at end of file +{"screen_lines":35,"columns":139} diff --git a/alacritty_terminal/tests/ref/zsh_tab_completion/size.json b/alacritty_terminal/tests/ref/zsh_tab_completion/size.json index 8937a062..d9852f89 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,"columns":105,"screen_lines":29} +{"columns":105,"screen_lines":29}