summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKirill Chibisov <contact@kchibisov.com>2023-12-08 23:25:05 +0400
committerGitHub <noreply@github.com>2023-12-08 23:25:05 +0400
commitc0c267d60e1b877d5c2c76893751d13547a233c4 (patch)
tree88ea0bb709926b978a955b62539134107d9915ab
parente12c750edb776ace9d7f6d302786f5dd06d6e968 (diff)
downloadalacritty-c0c267d60e1b877d5c2c76893751d13547a233c4.tar.gz
alacritty-c0c267d60e1b877d5c2c76893751d13547a233c4.zip
Fix message bar not damaged when the same size
The regression was added due to `y` coordinate in OpenGL differs to `y` inside the damage rectangles. Fixes: 40160c5d (Damage only terminal inside `alacritty_terminal`)
-rw-r--r--alacritty/src/display/damage.rs42
-rw-r--r--alacritty/src/display/mod.rs6
2 files changed, 43 insertions, 5 deletions
diff --git a/alacritty/src/display/damage.rs b/alacritty/src/display/damage.rs
index 24033fa5..450643b7 100644
--- a/alacritty/src/display/damage.rs
+++ b/alacritty/src/display/damage.rs
@@ -164,11 +164,19 @@ impl FrameDamage {
self.full = true;
}
- /// Add a damage rectangle.
+ /// Add viewport rectangle to damage.
///
/// This allows covering elements outside of the terminal viewport, like message bar.
#[inline]
- pub fn add_rect(&mut self, x: i32, y: i32, width: i32, height: i32) {
+ pub fn add_viewport_rect(
+ &mut self,
+ size_info: &SizeInfo,
+ x: i32,
+ y: i32,
+ width: i32,
+ height: i32,
+ ) {
+ let y = viewport_y_to_damage_y(size_info, y, height);
self.rects.push(Rect { x, y, width, height });
}
@@ -183,6 +191,16 @@ impl FrameDamage {
}
}
+/// Convert viewport `y` coordinate to [`Rect`] damage coordinate.
+pub fn viewport_y_to_damage_y(size_info: &SizeInfo, y: i32, height: i32) -> i32 {
+ size_info.height() as i32 - y - height
+}
+
+/// Convert viewport `y` coordinate to [`Rect`] damage coordinate.
+pub fn damage_y_to_viewport_y(size_info: &SizeInfo, rect: &Rect) -> i32 {
+ size_info.height() as i32 - rect.y - rect.height
+}
+
/// Iterator which converts `alacritty_terminal` damage information into renderer damaged rects.
struct RenderDamageIterator<'a> {
damaged_lines: Peekable<TermDamageIterator<'a>>,
@@ -316,4 +334,24 @@ mod tests {
rect
);
}
+
+ #[test]
+ fn add_viewport_damage() {
+ let mut frame_damage = FrameDamage::default();
+ let viewport_height = 100.;
+ let x = 0;
+ let y = 40;
+ let height = 5;
+ let width = 10;
+ let size_info = SizeInfo::new(viewport_height, viewport_height, 5., 5., 0., 0., true);
+ frame_damage.add_viewport_rect(&size_info, x, y, width, height);
+ assert_eq!(frame_damage.rects[0], Rect {
+ x,
+ y: viewport_height as i32 - y - height,
+ width,
+ height
+ });
+ assert_eq!(frame_damage.rects[0].y, viewport_y_to_damage_y(&size_info, y, height));
+ assert_eq!(damage_y_to_viewport_y(&size_info, &frame_damage.rects[0]), y);
+ }
}
diff --git a/alacritty/src/display/mod.rs b/alacritty/src/display/mod.rs
index 5b28b252..dc37794d 100644
--- a/alacritty/src/display/mod.rs
+++ b/alacritty/src/display/mod.rs
@@ -43,7 +43,7 @@ use crate::display::bell::VisualBell;
use crate::display::color::{List, Rgb};
use crate::display::content::{RenderableContent, RenderableCursor};
use crate::display::cursor::IntoRects;
-use crate::display::damage::DamageTracker;
+use crate::display::damage::{damage_y_to_viewport_y, DamageTracker};
use crate::display::hint::{HintMatch, HintState};
use crate::display::meter::Meter;
use crate::display::window::Window;
@@ -935,7 +935,7 @@ impl Display {
rects.push(message_bar_rect);
// Always damage message bar, since it could have messages of the same size in it.
- self.damage_tracker.frame().add_rect(x, y as i32, width, height);
+ self.damage_tracker.frame().add_viewport_rect(&size_info, x, y as i32, width, height);
// Draw rectangles.
self.renderer.draw_rects(&size_info, &metrics, rects);
@@ -1327,7 +1327,7 @@ impl Display {
let x = damage_rect.x as f32;
let height = damage_rect.height as f32;
let width = damage_rect.width as f32;
- let y = self.size_info.height() - damage_rect.y as f32 - height;
+ let y = damage_y_to_viewport_y(&self.size_info, damage_rect) as f32;
let render_rect = RenderRect::new(x, y, width, height, DAMAGE_RECT_COLOR, 0.5);
render_rects.push(render_rect);