diff options
author | Christian Duerr <contact@christianduerr.com> | 2017-12-10 00:33:58 +0100 |
---|---|---|
committer | Joe Wilm <jwilm@users.noreply.github.com> | 2017-12-24 09:46:54 -0800 |
commit | fe29b8c6873c82517a218067abbf56b64cae413b (patch) | |
tree | a2cff4b838448d9e45ed56374db363dbcf724259 /font | |
parent | 8195d7103498043270523bd81d703cb678cd11a2 (diff) | |
download | alacritty-fe29b8c6873c82517a218067abbf56b64cae413b.tar.gz alacritty-fe29b8c6873c82517a218067abbf56b64cae413b.zip |
Add custom box cursor for unfocused window
Diffstat (limited to 'font')
-rw-r--r-- | font/src/darwin/mod.rs | 14 | ||||
-rw-r--r-- | font/src/ft/mod.rs | 8 | ||||
-rw-r--r-- | font/src/lib.rs | 47 |
3 files changed, 56 insertions, 13 deletions
diff --git a/font/src/darwin/mod.rs b/font/src/darwin/mod.rs index a6deba3b..56685dd5 100644 --- a/font/src/darwin/mod.rs +++ b/font/src/darwin/mod.rs @@ -470,8 +470,8 @@ impl Font { let width = self.glyph_advance('0') as i32; // Return the new custom glyph return super::get_underline_cursor_glyph(descent, width); - }, - super::BEAM_CURSOR_CHAR => { + } + super::BEAM_CURSOR_CHAR | super::BOX_CURSOR_CHAR => { // Get the top of the bounding box let metrics = self.metrics(); let height = metrics.line_height; @@ -483,9 +483,13 @@ impl Font { // Get the width of the cell let width = self.glyph_advance('0') as i32; // Return the new custom glyph - return super::get_beam_cursor_glyph(ascent as i32, height as i32, width); - }, - _ => (), + if character == super::BEAM_CURSOR_CHAR { + return super::get_beam_cursor_glyph(ascent as i32, height as i32, width); + } else { + return super::get_box_cursor_glyph(ascent as i32, height as i32, width); + } + } + _ => () } let glyph_index = self.glyph_index(character) diff --git a/font/src/ft/mod.rs b/font/src/ft/mod.rs index 765e8efb..44dc0be3 100644 --- a/font/src/ft/mod.rs +++ b/font/src/ft/mod.rs @@ -310,7 +310,7 @@ impl FreeTypeRasterizer { // Return the new custom glyph super::get_underline_cursor_glyph(descent, width) } - super::BEAM_CURSOR_CHAR => { + super::BEAM_CURSOR_CHAR | super::BOX_CURSOR_CHAR => { // Get the top of the bounding box let size_metrics = face.ft_face .size_metrics() @@ -326,7 +326,11 @@ impl FreeTypeRasterizer { let width = (metrics.vertAdvance as f32 / 128.).round() as i32; // Return the new custom glyph - super::get_beam_cursor_glyph(ascent, height, width) + if glyph_key.c == super::BEAM_CURSOR_CHAR { + super::get_beam_cursor_glyph(ascent, height, width) + } else { + super::get_box_cursor_glyph(ascent, height, width) + } } _ => { // If it's not a special char, return the normal glyph diff --git a/font/src/lib.rs b/font/src/lib.rs index f9eaaac6..68935e45 100644 --- a/font/src/lib.rs +++ b/font/src/lib.rs @@ -58,6 +58,9 @@ mod darwin; #[cfg(target_os = "macos")] pub use darwin::*; +/// Width/Height of the cursor relative to the font width +pub const CURSOR_WIDTH_PERCENTAGE: i32 = 15; + /// Character used for the underline cursor // This is part of the private use area and should not conflict with any font pub const UNDERLINE_CURSOR_CHAR: char = '\u{10a3e2}'; @@ -65,8 +68,10 @@ pub const UNDERLINE_CURSOR_CHAR: char = '\u{10a3e2}'; /// Character used for the beam cursor // This is part of the private use area and should not conflict with any font pub const BEAM_CURSOR_CHAR: char = '\u{10a3e3}'; -/// Width of the beam cursor relative to the font width -pub const BEAM_CURSOR_WIDTH_PERCENTAGE: i32 = 15; + +/// Character used for the empty box cursor +// This is part of the private use area and should not conflict with any font +pub const BOX_CURSOR_CHAR: char = '\u{10a3e4}'; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct FontDesc { @@ -214,9 +219,8 @@ impl Default for RasterizedGlyph { // Returns a custom underline cursor character pub fn get_underline_cursor_glyph(descent: i32, width: i32) -> Result<RasterizedGlyph, Error> { - // Create a new rectangle, the height is half the distance between - // bounding box bottom and the baseline - let height = cmp::max(i32::abs(descent / 2), 1); + // Create a new rectangle, the height is relative to the font width + let height = cmp::max(width * CURSOR_WIDTH_PERCENTAGE / 100, 1); let buf = vec![255u8; (width * height * 3) as usize]; // Create a custom glyph with the rectangle data attached to it @@ -237,7 +241,7 @@ pub fn get_beam_cursor_glyph( width: i32, ) -> Result<RasterizedGlyph, Error> { // Create a new rectangle that is at least one pixel wide - let beam_width = cmp::max(width * BEAM_CURSOR_WIDTH_PERCENTAGE / 100, 1); + let beam_width = cmp::max(width * CURSOR_WIDTH_PERCENTAGE / 100, 1); let buf = vec![255u8; (beam_width * height * 3) as usize]; // Create a custom glyph with the rectangle data attached to it @@ -251,6 +255,37 @@ pub fn get_beam_cursor_glyph( }); } +// Returns a custom beam cursor character +pub fn get_box_cursor_glyph( + ascent: i32, + height: i32, + width: i32, +) -> Result<RasterizedGlyph, Error> { + // Create a new box outline rectangle + let border_width = cmp::max(width * CURSOR_WIDTH_PERCENTAGE / 100, 1); + let mut buf = Vec::with_capacity((width * height * 3) as usize); + for y in 0..height { + for x in 0..width { + if y < border_width || y >= height - border_width || + x < border_width || x >= width - border_width { + buf.append(&mut vec![255u8; 3]); + } else { + buf.append(&mut vec![0u8; 3]); + } + } + } + + // Create a custom glyph with the rectangle data attached to it + return Ok(RasterizedGlyph { + c: BOX_CURSOR_CHAR, + top: ascent, + left: 0, + height, + width, + buf: buf, + }); +} + struct BufDebugger<'a>(&'a [u8]); impl<'a> fmt::Debug for BufDebugger<'a> { |