@@ -18,6 +18,7 @@ use super::{
1818use crate :: animation:: { Animation , Clock } ;
1919use crate :: layout:: SizingMode ;
2020use crate :: niri_render_elements;
21+ use crate :: render_helpers:: background_effect:: { self , BackgroundEffect , BackgroundEffectElement } ;
2122use crate :: render_helpers:: border:: BorderRenderElement ;
2223use crate :: render_helpers:: clipped_surface:: { ClippedSurfaceRenderElement , RoundedCornerDamage } ;
2324use crate :: render_helpers:: damage:: ExtraDamage ;
@@ -57,6 +58,9 @@ pub struct Tile<W: LayoutElement> {
5758 /// The black backdrop for fullscreen windows.
5859 fullscreen_backdrop : SolidColorBuffer ,
5960
61+ /// The background effect underneath the window geometry.
62+ pub background_effect : BackgroundEffect ,
63+
6064 /// Whether the tile should float upon unfullscreening.
6165 pub ( super ) restore_to_floating : bool ,
6266
@@ -130,6 +134,7 @@ niri_render_elements! {
130134 ClippedSurface = ClippedSurfaceRenderElement <R >,
131135 Offscreen = OffscreenRenderElement ,
132136 ExtraDamage = ExtraDamage ,
137+ BackgroundEffect = BackgroundEffectElement ,
133138 }
134139}
135140
@@ -192,6 +197,7 @@ impl<W: LayoutElement> Tile<W> {
192197 shadow : Shadow :: new ( shadow_config) ,
193198 sizing_mode,
194199 fullscreen_backdrop : SolidColorBuffer :: new ( ( 0. , 0. ) , [ 0. , 0. , 0. , 1. ] ) ,
200+ background_effect : BackgroundEffect :: new ( ) ,
195201 restore_to_floating : false ,
196202 floating_window_size : None ,
197203 floating_pos : None ,
@@ -455,6 +461,7 @@ impl<W: LayoutElement> Tile<W> {
455461 pub fn update_render_elements ( & mut self , is_active : bool , view_rect : Rectangle < f64 , Logical > ) {
456462 let rules = self . window . rules ( ) ;
457463 let animated_tile_size = self . animated_tile_size ( ) ;
464+ let animated_window_size = self . animated_window_size ( ) ;
458465 let expanded_progress = self . expanded_progress ( ) ;
459466
460467 let draw_border_with_background = rules
@@ -505,6 +512,16 @@ impl<W: LayoutElement> Tile<W> {
505512 1. - expanded_progress as f32 ,
506513 ) ;
507514
515+ let effect = rules. background_effect ;
516+ self . background_effect
517+ . update_params ( background_effect:: Parameters {
518+ corner_radius : radius,
519+ xray : effect. xray ,
520+ // TODO: ext-background-effect
521+ blur : effect. blur == Some ( true ) ,
522+ } ) ;
523+ self . background_effect . update_size ( animated_window_size) ;
524+
508525 let draw_focus_ring_with_background = if self . border . is_off ( ) {
509526 draw_border_with_background
510527 } else {
@@ -1283,6 +1300,11 @@ impl<W: LayoutElement> Tile<W> {
12831300 self . shadow
12841301 . render ( renderer, location, & mut |elem| push ( elem. into ( ) ) ) ;
12851302 }
1303+
1304+ // TODO subsurfaces peeking out of the main surface? Ext background effect subsurfaces?
1305+ if let Some ( elem) = self . background_effect . render ( renderer. as_gles_renderer ( ) ) {
1306+ push ( elem. with_location ( window_render_loc) . into ( ) ) ;
1307+ }
12861308 }
12871309
12881310 pub fn render < R : NiriRenderer > (
0 commit comments