@@ -3,13 +3,14 @@ use niri_config::{Config, LayerRule};
33use smithay:: backend:: renderer:: element:: surface:: WaylandSurfaceRenderElement ;
44use smithay:: backend:: renderer:: element:: Kind ;
55use smithay:: desktop:: { LayerSurface , PopupManager } ;
6- use smithay:: utils:: { Logical , Point , Scale , Size } ;
6+ use smithay:: utils:: { Logical , Point , Rectangle , Scale , Size } ;
77use smithay:: wayland:: shell:: wlr_layer:: { ExclusiveZone , Layer } ;
88
99use super :: ResolvedLayerRules ;
1010use crate :: animation:: Clock ;
1111use crate :: layout:: shadow:: Shadow ;
1212use crate :: niri_render_elements;
13+ use crate :: render_helpers:: background_effect:: { self , BackgroundEffect , BackgroundEffectElement } ;
1314use crate :: render_helpers:: renderer:: NiriRenderer ;
1415use crate :: render_helpers:: shadow:: ShadowRenderElement ;
1516use crate :: render_helpers:: solid_color:: { SolidColorBuffer , SolidColorRenderElement } ;
@@ -31,6 +32,9 @@ pub struct MappedLayer {
3132 /// The shadow around the surface.
3233 shadow : Shadow ,
3334
35+ /// The background effect underneath the layer surface geometry.
36+ pub background_effect : BackgroundEffect ,
37+
3438 /// The view size for the layer surface's output.
3539 view_size : Size < f64 , Logical > ,
3640
@@ -46,6 +50,7 @@ niri_render_elements! {
4650 Wayland = WaylandSurfaceRenderElement <R >,
4751 SolidColor = SolidColorRenderElement ,
4852 Shadow = ShadowRenderElement ,
53+ BackgroundEffect = BackgroundEffectElement ,
4954 }
5055}
5156
@@ -70,6 +75,7 @@ impl MappedLayer {
7075 view_size,
7176 scale,
7277 shadow : Shadow :: new ( shadow_config) ,
78+ background_effect : BackgroundEffect :: new ( ) ,
7379 clock,
7480 }
7581 }
@@ -91,7 +97,11 @@ impl MappedLayer {
9197 self . scale = scale;
9298 }
9399
94- pub fn update_render_elements ( & mut self , size : Size < f64 , Logical > ) {
100+ pub fn update_render_elements (
101+ & mut self ,
102+ size : Size < f64 , Logical > ,
103+ view_rect : Rectangle < f64 , Logical > ,
104+ ) {
95105 // Round to physical pixels.
96106 let size = size
97107 . to_physical_precise_round ( self . scale )
@@ -103,6 +113,18 @@ impl MappedLayer {
103113 // FIXME: is_active based on keyboard focus?
104114 self . shadow
105115 . update_render_elements ( size, true , radius, self . scale , 1. ) ;
116+
117+ let effect = self . rules . background_effect ;
118+ self . background_effect
119+ . update_params ( background_effect:: Parameters {
120+ view_rect_loc : view_rect. loc ,
121+ scale : self . scale as f32 ,
122+ corner_radius : radius,
123+ xray : effect. xray ,
124+ // TODO: ext-background-effect
125+ blur : effect. blur == Some ( true ) ,
126+ } ) ;
127+ self . background_effect . update_size ( size) ;
106128 }
107129
108130 pub fn are_animations_ongoing ( & self ) -> bool {
@@ -197,6 +219,12 @@ impl MappedLayer {
197219 let location = location. to_physical_precise_round ( scale) . to_logical ( scale) ;
198220 self . shadow
199221 . render ( renderer, location, & mut |elem| push ( elem. into ( ) ) ) ;
222+
223+ // TODO subsurfaces peeking out of the main surface? Ext background effect subsurfaces?
224+ if let Some ( elem) = self . background_effect . render ( renderer. as_gles_renderer ( ) ) {
225+ let location = location. to_physical_precise_round ( scale) . to_logical ( scale) ;
226+ push ( elem. with_location ( location) . into ( ) ) ;
227+ }
200228 }
201229
202230 pub fn render_popups < R : NiriRenderer > (
0 commit comments