diff options
author | Kirill Chibisov <contact@kchibisov.com> | 2022-04-06 13:06:39 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-06 13:06:39 +0300 |
commit | 673710487afac8596a9f18fea9e04aeada32c2be (patch) | |
tree | 1305e00422c01e35d91c533b12004c0082528eb4 /alacritty/src | |
parent | 851dbc328efd9b212bb2c7b9caaf5763eb4e524b (diff) | |
download | r-alacritty-673710487afac8596a9f18fea9e04aeada32c2be.tar.gz r-alacritty-673710487afac8596a9f18fea9e04aeada32c2be.tar.bz2 r-alacritty-673710487afac8596a9f18fea9e04aeada32c2be.zip |
Extract `SizeInfo` from alacritty_terminal
The `SizeInfo` is a SizeInfo used for rendering, which contains
information about padding, and such, however all the terminal need is
number of visible lines and columns.
Diffstat (limited to 'alacritty/src')
-rw-r--r-- | alacritty/src/display/cursor.rs | 2 | ||||
-rw-r--r-- | alacritty/src/display/damage.rs | 4 | ||||
-rw-r--r-- | alacritty/src/display/mod.rs | 171 | ||||
-rw-r--r-- | alacritty/src/display/window.rs | 2 | ||||
-rw-r--r-- | alacritty/src/event.rs | 8 | ||||
-rw-r--r-- | alacritty/src/input.rs | 6 | ||||
-rw-r--r-- | alacritty/src/message_bar.rs | 5 | ||||
-rw-r--r-- | alacritty/src/renderer/mod.rs | 2 | ||||
-rw-r--r-- | alacritty/src/renderer/rects.rs | 2 | ||||
-rw-r--r-- | alacritty/src/renderer/text/gles2.rs | 2 | ||||
-rw-r--r-- | alacritty/src/renderer/text/glsl3.rs | 2 | ||||
-rw-r--r-- | alacritty/src/renderer/text/mod.rs | 2 | ||||
-rw-r--r-- | alacritty/src/window_context.rs | 9 |
13 files changed, 193 insertions, 24 deletions
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<glutin::ContextError> for Error { } } +/// Terminal size info. +#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq)] +pub struct SizeInfo<T = f32> { + /// 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<SizeInfo<f32>> for SizeInfo<u32> { + fn from(size_info: SizeInfo<f32>) -> 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<SizeInfo<f32>> for WindowSize { + fn from(size_info: SizeInfo<f32>) -> 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<T: Clone + Copy> SizeInfo<T> { + #[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<f32> { + #[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<EventProxy, ActionContext<'_, Notifier, EventProxy>> { .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()); |