aboutsummaryrefslogtreecommitdiff
path: root/src/layout
diff options
context:
space:
mode:
Diffstat (limited to 'src/layout')
-rw-r--r--src/layout/mod.rs32
-rw-r--r--src/layout/tile.rs29
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());