aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2024-08-23 12:48:20 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2024-08-23 12:54:07 +0300
commitff7cbb97dfc1bc584b4363f60858ef132bb0bda4 (patch)
treeff092f4b10911af1391f5eefad683c2723bedeec /src
parent09f3d3fb1217e3015ef002ca0aab2918fd2aaedc (diff)
downloadniri-ff7cbb97dfc1bc584b4363f60858ef132bb0bda4.tar.gz
niri-ff7cbb97dfc1bc584b4363f60858ef132bb0bda4.tar.bz2
niri-ff7cbb97dfc1bc584b4363f60858ef132bb0bda4.zip
Fix screen transition across scale/transform changes
Diffstat (limited to 'src')
-rw-r--r--src/niri.rs18
-rw-r--r--src/render_helpers/texture.rs12
-rw-r--r--src/ui/screen_transition.rs9
3 files changed, 35 insertions, 4 deletions
diff --git a/src/niri.rs b/src/niri.rs
index 277fc45f..a507b09a 100644
--- a/src/niri.rs
+++ b/src/niri.rs
@@ -2855,6 +2855,17 @@ impl Niri {
pub fn update_render_elements(&mut self, output: Option<&Output>) {
self.layout.update_render_elements(output);
+
+ for (out, state) in self.output_state.iter_mut() {
+ if output.map_or(true, |output| out == output) {
+ let scale = Scale::from(out.current_scale().fractional_scale());
+ let transform = out.current_transform();
+
+ if let Some(transition) = &mut state.screen_transition {
+ transition.update_render_elements(scale, transform);
+ }
+ }
+ }
}
pub fn render<R: NiriRenderer>(
@@ -4554,7 +4565,6 @@ impl Niri {
.filter_map(|output| {
let size = output.current_mode().unwrap().size;
let transform = output.current_transform();
- let size = transform.transform_size(size);
let scale = Scale::from(output.current_scale().fractional_scale());
let targets = [
@@ -4570,7 +4580,7 @@ impl Niri {
renderer,
size,
scale,
- Transform::Normal,
+ transform,
Fourcc::Abgr8888,
elements,
);
@@ -4591,8 +4601,8 @@ impl Niri {
TextureBuffer::from_texture(
renderer,
texture,
- output.current_scale().fractional_scale(),
- Transform::Normal,
+ scale,
+ transform,
Vec::new(), // We want windows below to get frame callbacks.
)
});
diff --git a/src/render_helpers/texture.rs b/src/render_helpers/texture.rs
index cb2d3799..b7b45c65 100644
--- a/src/render_helpers/texture.rs
+++ b/src/render_helpers/texture.rs
@@ -92,6 +92,18 @@ impl<T> TextureBuffer<T> {
pub fn texture_scale(&self) -> Scale<f64> {
self.scale
}
+
+ pub fn set_texture_scale(&mut self, scale: impl Into<Scale<f64>>) {
+ self.scale = scale.into();
+ }
+
+ pub fn texture_transform(&self) -> Transform {
+ self.transform
+ }
+
+ pub fn set_texture_transform(&mut self, transform: Transform) {
+ self.transform = transform;
+ }
}
impl<T: Texture> TextureBuffer<T> {
diff --git a/src/ui/screen_transition.rs b/src/ui/screen_transition.rs
index ecec1f1e..3b5c2159 100644
--- a/src/ui/screen_transition.rs
+++ b/src/ui/screen_transition.rs
@@ -2,6 +2,7 @@ use std::time::Duration;
use smithay::backend::renderer::element::Kind;
use smithay::backend::renderer::gles::GlesTexture;
+use smithay::utils::{Scale, Transform};
use crate::render_helpers::primary_gpu_texture::PrimaryGpuTextureRenderElement;
use crate::render_helpers::texture::{TextureBuffer, TextureRenderElement};
@@ -43,6 +44,14 @@ impl ScreenTransition {
self.alpha == 0.
}
+ pub fn update_render_elements(&mut self, scale: Scale<f64>, transform: Transform) {
+ // These textures should remain full-screen, even if scale or transform changes.
+ for buffer in &mut self.from_texture {
+ buffer.set_texture_scale(scale);
+ buffer.set_texture_transform(transform);
+ }
+ }
+
pub fn render(&self, target: RenderTarget) -> PrimaryGpuTextureRenderElement {
let idx = match target {
RenderTarget::Output => 0,