aboutsummaryrefslogtreecommitdiff
path: root/src/layout/opening_window.rs
diff options
context:
space:
mode:
authorIvan Molodetskikh <yalterz@gmail.com>2025-03-01 09:45:57 +0300
committerIvan Molodetskikh <yalterz@gmail.com>2025-03-10 07:59:14 +0300
commitb351f6ff220560d96a260d8dd3ad794000923481 (patch)
treef2bd1a777fe9f932fea2cfeba3677cbb39b634eb /src/layout/opening_window.rs
parent12817a682d666e81e30b5a723d6419baf74cdb1c (diff)
downloadniri-b351f6ff220560d96a260d8dd3ad794000923481.tar.gz
niri-b351f6ff220560d96a260d8dd3ad794000923481.tar.bz2
niri-b351f6ff220560d96a260d8dd3ad794000923481.zip
Keep track of RenderElementStates in offscreens
This both avoids sending frame callbacks to surfaces invisible on the offscreen (fixing Firefox with subsurface compositing in the process), and fixes searching for split popups during the resize animation.
Diffstat (limited to 'src/layout/opening_window.rs')
-rw-r--r--src/layout/opening_window.rs20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/layout/opening_window.rs b/src/layout/opening_window.rs
index 8a1db409..19727551 100644
--- a/src/layout/opening_window.rs
+++ b/src/layout/opening_window.rs
@@ -5,14 +5,14 @@ use glam::{Mat3, Vec2};
use smithay::backend::renderer::element::utils::{
Relocate, RelocateRenderElement, RescaleRenderElement,
};
-use smithay::backend::renderer::element::{Kind, RenderElement};
+use smithay::backend::renderer::element::{Element as _, Kind, RenderElement};
use smithay::backend::renderer::gles::{GlesRenderer, Uniform};
use smithay::backend::renderer::Texture;
use smithay::utils::{Logical, Point, Rectangle, Scale, Size};
use crate::animation::Animation;
use crate::niri_render_elements;
-use crate::render_helpers::offscreen::{OffscreenBuffer, OffscreenRenderElement};
+use crate::render_helpers::offscreen::{OffscreenBuffer, OffscreenData, OffscreenRenderElement};
use crate::render_helpers::shader_element::ShaderRenderElement;
use crate::render_helpers::shaders::{mat3_uniform, ProgramType, Shaders};
@@ -55,11 +55,11 @@ impl OpenAnimation {
location: Point<f64, Logical>,
scale: Scale<f64>,
alpha: f32,
- ) -> anyhow::Result<OpeningWindowRenderElement> {
+ ) -> anyhow::Result<(OpeningWindowRenderElement, OffscreenData)> {
let progress = self.anim.value();
let clamped_progress = self.anim.clamped_value().clamp(0., 1.);
- let (elem, _sync_point) = self
+ let (elem, _sync_point, mut data) = self
.buffer
.render(renderer, scale, elements)
.context("error rendering to offscreen buffer")?;
@@ -98,7 +98,7 @@ impl OpenAnimation {
let geo_to_tex =
Mat3::from_translation(-tex_loc / tex_size) * Mat3::from_scale(geo_size / tex_size);
- return Ok(ShaderRenderElement::new(
+ let elem = ShaderRenderElement::new(
ProgramType::Open,
area.size,
None,
@@ -115,8 +115,12 @@ impl OpenAnimation {
HashMap::from([(String::from("niri_tex"), texture.clone())]),
Kind::Unspecified,
)
- .with_location(area.loc)
- .into());
+ .with_location(area.loc);
+
+ // We're drawing the shader, not the offscreen itself.
+ data.id = elem.id().clone();
+
+ return Ok((elem.into(), data));
}
let elem = elem.with_alpha(clamped_progress as f32 * alpha);
@@ -134,6 +138,6 @@ impl OpenAnimation {
Relocate::Relative,
);
- Ok(elem.into())
+ Ok((elem.into(), data))
}
}