diff options
Diffstat (limited to 'src/layout')
| -rw-r--r-- | src/layout/mod.rs | 32 | ||||
| -rw-r--r-- | src/layout/tile.rs | 29 |
2 files changed, 50 insertions, 11 deletions
diff --git a/src/layout/mod.rs b/src/layout/mod.rs index 5ca48ad6..83715364 100644 --- a/src/layout/mod.rs +++ b/src/layout/mod.rs @@ -51,7 +51,7 @@ use self::workspace::{compute_working_area, Column, ColumnWidth, OutputId, Works use crate::niri_render_elements; use crate::render_helpers::renderer::NiriRenderer; use crate::render_helpers::snapshot::RenderSnapshot; -use crate::render_helpers::{BakedBuffer, RenderTarget}; +use crate::render_helpers::{BakedBuffer, RenderTarget, SplitElements}; use crate::utils::output_size; use crate::window::ResolvedWindowRules; @@ -108,7 +108,31 @@ pub trait LayoutElement { scale: Scale<f64>, alpha: f32, target: RenderTarget, - ) -> Vec<LayoutElementRenderElement<R>>; + ) -> SplitElements<LayoutElementRenderElement<R>>; + + /// Renders the non-popup parts of the element. + fn render_normal<R: NiriRenderer>( + &self, + renderer: &mut R, + location: Point<i32, Logical>, + scale: Scale<f64>, + alpha: f32, + target: RenderTarget, + ) -> Vec<LayoutElementRenderElement<R>> { + self.render(renderer, location, scale, alpha, target).normal + } + + /// Renders the popups of the element. + fn render_popups<R: NiriRenderer>( + &self, + renderer: &mut R, + location: Point<i32, Logical>, + scale: Scale<f64>, + alpha: f32, + target: RenderTarget, + ) -> Vec<LayoutElementRenderElement<R>> { + self.render(renderer, location, scale, alpha, target).popups + } fn request_size(&mut self, size: Size<i32, Logical>, animate: bool); fn request_fullscreen(&self, size: Size<i32, Logical>); @@ -1984,8 +2008,8 @@ mod tests { _scale: Scale<f64>, _alpha: f32, _target: RenderTarget, - ) -> Vec<LayoutElementRenderElement<R>> { - vec![] + ) -> SplitElements<LayoutElementRenderElement<R>> { + SplitElements::default() } fn request_size(&mut self, size: Size<i32, Logical>, _animate: bool) { diff --git a/src/layout/tile.rs b/src/layout/tile.rs index 0e06dd1b..b1790df5 100644 --- a/src/layout/tile.rs +++ b/src/layout/tile.rs @@ -536,18 +536,31 @@ impl<W: LayoutElement> Tile<W> { let window_render_loc = location + window_loc; let area = Rectangle::from_loc_and_size(window_render_loc, animated_window_size); - let gles_renderer = renderer.as_gles_renderer(); - // If we're resizing, try to render a shader, or a fallback. let mut resize_shader = None; + let mut resize_popups = None; let mut resize_fallback = None; if let Some(resize) = &self.resize_animation { - if let Some(shader) = ResizeRenderElement::shader(gles_renderer) { + resize_popups = Some( + self.window + .render_popups(renderer, window_render_loc, scale, alpha, target) + .into_iter() + .map(Into::into), + ); + + if let Some(shader) = ResizeRenderElement::shader(renderer) { + let gles_renderer = renderer.as_gles_renderer(); + if let Some(texture_from) = resize.snapshot.texture(gles_renderer, scale, target) { - let window_elements = - self.window - .render(gles_renderer, Point::from((0, 0)), scale, 1., target); + let window_elements = self.window.render_normal( + gles_renderer, + Point::from((0, 0)), + scale, + 1., + target, + ); + let current = render_to_encompassing_texture( gles_renderer, scale, @@ -605,8 +618,10 @@ impl<W: LayoutElement> Tile<W> { ); } - let rv = resize_shader + let rv = resize_popups .into_iter() + .flatten() + .chain(resize_shader) .chain(resize_fallback) .chain(window.into_iter().flatten()); |
