fix: snap animated window edges consistently
This commit is contained in:
1 parent
c601dcbac5
commit
4ecd20905d
1 file changed
+38
-14
+38
-14
@@ -560,18 +560,7 @@ fn output_elements(
|
|||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
for (window, id, visual, fullscreen, close_alpha) in windows {
|
for (window, id, visual, fullscreen, close_alpha) in windows {
|
||||||
let constrain = Rectangle::<i32, Logical>::new(
|
let constrain = rounded_visual_rect(visual, output_geometry.loc);
|
||||||
(
|
|
||||||
(visual.x - f64::from(output_geometry.loc.x)).round() as i32,
|
|
||||||
(visual.y - f64::from(output_geometry.loc.y)).round() as i32,
|
|
||||||
)
|
|
||||||
.into(),
|
|
||||||
(
|
|
||||||
visual.width.round().max(1.0) as i32,
|
|
||||||
visual.height.round().max(1.0) as i32,
|
|
||||||
)
|
|
||||||
.into(),
|
|
||||||
);
|
|
||||||
|
|
||||||
if !fullscreen && let Some(programs) = rounded_clip_program.clone() {
|
if !fullscreen && let Some(programs) = rounded_clip_program.clone() {
|
||||||
let window_radius = state.theme_settings.window_radius;
|
let window_radius = state.theme_settings.window_radius;
|
||||||
@@ -988,6 +977,21 @@ fn color_with_alpha(mut color: [f32; 4], alpha: f32) -> [f32; 4] {
|
|||||||
color
|
color
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn rounded_visual_rect(
|
||||||
|
rect: ferese_layout::Rect,
|
||||||
|
output_location: Point<i32, Logical>,
|
||||||
|
) -> Rectangle<i32, Logical> {
|
||||||
|
let left = (rect.x - f64::from(output_location.x)).round() as i32;
|
||||||
|
let top = (rect.y - f64::from(output_location.y)).round() as i32;
|
||||||
|
let right = (rect.x + rect.width - f64::from(output_location.x)).round() as i32;
|
||||||
|
let bottom = (rect.y + rect.height - f64::from(output_location.y)).round() as i32;
|
||||||
|
|
||||||
|
Rectangle::new(
|
||||||
|
(left, top).into(),
|
||||||
|
((right - left).max(1), (bottom - top).max(1)).into(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fn framebuffer_clip_rect(
|
fn framebuffer_clip_rect(
|
||||||
geometry: Rectangle<i32, Physical>,
|
geometry: Rectangle<i32, Physical>,
|
||||||
output_size: smithay::utils::Size<i32, Physical>,
|
output_size: smithay::utils::Size<i32, Physical>,
|
||||||
@@ -1172,8 +1176,8 @@ mod tests {
|
|||||||
use smithay::utils::{Logical, Physical, Rectangle, Transform};
|
use smithay::utils::{Logical, Physical, Rectangle, Transform};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
color_with_alpha, framebuffer_clip_rect, normalized_scale, scaled_visual_rect,
|
color_with_alpha, framebuffer_clip_rect, normalized_scale, rounded_visual_rect,
|
||||||
shadow_bounds,
|
scaled_visual_rect, shadow_bounds,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -1244,4 +1248,24 @@ mod tests {
|
|||||||
[0.2, 0.4, 0.6, 0.4]
|
[0.2, 0.4, 0.6, 0.4]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn visual_rect_rounds_shared_edges_instead_of_size() {
|
||||||
|
let rect = ferese_layout::Rect::new(100.5, 50.25, 399.5, 299.75);
|
||||||
|
let rounded = rounded_visual_rect(rect, (0, 0).into());
|
||||||
|
|
||||||
|
assert_eq!(rounded, Rectangle::new((101, 50).into(), (399, 300).into()));
|
||||||
|
assert_eq!(rounded.loc.x + rounded.size.w, 500);
|
||||||
|
assert_eq!(rounded.loc.y + rounded.size.h, 350);
|
||||||
|
|
||||||
|
for tenth in 0..=10 {
|
||||||
|
let left = 100.0 + f64::from(tenth) / 10.0;
|
||||||
|
let frame = rounded_visual_rect(
|
||||||
|
ferese_layout::Rect::new(left, 50.0, 500.0 - left, 300.0),
|
||||||
|
(0, 0).into(),
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_eq!(frame.loc.x + frame.size.w, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user