diff options
| author | Ivan Molodetskikh <yalterz@gmail.com> | 2024-08-23 12:48:20 +0300 |
|---|---|---|
| committer | Ivan Molodetskikh <yalterz@gmail.com> | 2024-08-23 12:54:07 +0300 |
| commit | ff7cbb97dfc1bc584b4363f60858ef132bb0bda4 (patch) | |
| tree | ff092f4b10911af1391f5eefad683c2723bedeec | |
| parent | 09f3d3fb1217e3015ef002ca0aab2918fd2aaedc (diff) | |
| download | niri-ff7cbb97dfc1bc584b4363f60858ef132bb0bda4.tar.gz niri-ff7cbb97dfc1bc584b4363f60858ef132bb0bda4.tar.bz2 niri-ff7cbb97dfc1bc584b4363f60858ef132bb0bda4.zip | |
Fix screen transition across scale/transform changes
| -rw-r--r-- | src/niri.rs | 18 | ||||
| -rw-r--r-- | src/render_helpers/texture.rs | 12 | ||||
| -rw-r--r-- | src/ui/screen_transition.rs | 9 |
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, |
