aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src
diff options
context:
space:
mode:
authorKirill Chibisov <contact@kchibisov.com>2022-04-06 13:06:39 +0300
committerGitHub <noreply@github.com>2022-04-06 13:06:39 +0300
commit673710487afac8596a9f18fea9e04aeada32c2be (patch)
tree1305e00422c01e35d91c533b12004c0082528eb4 /alacritty/src
parent851dbc328efd9b212bb2c7b9caaf5763eb4e524b (diff)
downloadr-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.rs2
-rw-r--r--alacritty/src/display/damage.rs4
-rw-r--r--alacritty/src/display/mod.rs171
-rw-r--r--alacritty/src/display/window.rs2
-rw-r--r--alacritty/src/event.rs8
-rw-r--r--alacritty/src/input.rs6
-rw-r--r--alacritty/src/message_bar.rs5
-rw-r--r--alacritty/src/renderer/mod.rs2
-rw-r--r--alacritty/src/renderer/rects.rs2
-rw-r--r--alacritty/src/renderer/text/gles2.rs2
-rw-r--r--alacritty/src/renderer/text/glsl3.rs2
-rw-r--r--alacritty/src/renderer/text/mod.rs2
-rw-r--r--alacritty/src/window_context.rs9
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());