@@ -29,7 +29,6 @@ use sctk::shm::slot::SlotPool;
2929use sctk:: subcompositor:: SubcompositorState ;
3030use tracing:: { info, warn} ;
3131use wayland_protocols:: xdg:: toplevel_icon:: v1:: client:: xdg_toplevel_icon_manager_v1:: XdgToplevelIconManagerV1 ;
32- use wayland_protocols_plasma:: blur:: client:: org_kde_kwin_blur:: OrgKdeKwinBlur ;
3332use winit_core:: cursor:: { CursorIcon , CustomCursor as CoreCustomCursor } ;
3433use winit_core:: error:: { NotSupportedError , RequestError } ;
3534use winit_core:: window:: {
@@ -43,8 +42,8 @@ use crate::seat::{
4342 ZwpTextInputV3Ext ,
4443} ;
4544use crate :: state:: { WindowCompositorUpdate , WinitState } ;
45+ use crate :: types:: bgr_effects:: { BgrEffectManager , SurfaceBlurEffect } ;
4646use crate :: types:: cursor:: { CustomCursor , SelectedCursor , WaylandCustomCursor } ;
47- use crate :: types:: kwin_blur:: KWinBlurManager ;
4847use crate :: types:: xdg_toplevel_icon_manager:: ToplevelIcon ;
4948
5049#[ cfg( feature = "sctk-adwaita" ) ]
@@ -156,8 +155,8 @@ pub struct WindowState {
156155
157156 viewport : Option < WpViewport > ,
158157 fractional_scale : Option < WpFractionalScaleV1 > ,
159- blur : Option < OrgKdeKwinBlur > ,
160- blur_manager : Option < KWinBlurManager > ,
158+ blur : Option < SurfaceBlurEffect > ,
159+ blur_manager : Option < BgrEffectManager > ,
161160
162161 /// Whether the client side decorations have pending move operations.
163162 ///
@@ -206,7 +205,7 @@ impl WindowState {
206205 toplevel_icon : None ,
207206 xdg_toplevel_icon_manager,
208207 blur : None ,
209- blur_manager : winit_state. kwin_blur_manager . clone ( ) ,
208+ blur_manager : winit_state. blur_manager . clone ( ) ,
210209 compositor,
211210 handle,
212211 csd_fails : false ,
@@ -742,6 +741,13 @@ impl WindowState {
742741 // Set surface size without the borders.
743742 viewport. set_destination ( self . size . width as _ , self . size . height as _ ) ;
744743 }
744+
745+ // Update blur region with new size.
746+ if self . blur . is_some ( ) {
747+ // NOTE: either user resized or configure, in both cases
748+ // the redraw scheduling is done on the caller side.
749+ let _ = self . set_blur ( true ) ;
750+ }
745751 }
746752
747753 /// Get the scale factor of the window.
@@ -1113,20 +1119,37 @@ impl WindowState {
11131119 }
11141120 }
11151121
1116- /// Make window background blurred
1117- #[ inline]
1118- pub fn set_blur ( & mut self , blurred : bool ) {
1119- if blurred && self . blur . is_none ( ) {
1120- if let Some ( blur_manager) = self . blur_manager . as_ref ( ) {
1121- let blur = blur_manager. blur ( self . window . wl_surface ( ) , & self . queue_handle ) ;
1122- blur. commit ( ) ;
1123- self . blur = Some ( blur) ;
1124- } else {
1125- info ! ( "Blur manager unavailable, unable to change blur" )
1126- }
1127- } else if !blurred && self . blur . is_some ( ) {
1128- self . blur_manager . as_ref ( ) . unwrap ( ) . unset ( self . window . wl_surface ( ) ) ;
1129- self . blur . take ( ) . unwrap ( ) . release ( ) ;
1122+ /// Make window background blurred.
1123+ ///
1124+ /// Returns `true` if redraw is required.
1125+ #[ must_use]
1126+ pub fn set_blur ( & mut self , blurred : bool ) -> bool {
1127+ if !blurred {
1128+ self . blur = None ;
1129+ return true ;
1130+ }
1131+
1132+ let mgr = match self . blur_manager . as_mut ( ) {
1133+ Some ( mgr) => mgr,
1134+ None => {
1135+ info ! ( "Blur manager unavailable, unable to change blur" ) ;
1136+ return false ;
1137+ } ,
1138+ } ;
1139+
1140+ let blur = match self . blur . as_ref ( ) {
1141+ Some ( blur) => blur,
1142+ None => {
1143+ self . blur = Some ( mgr. new_blur_effect ( self . window . wl_surface ( ) , & self . queue_handle ) ) ;
1144+ self . blur . as_ref ( ) . unwrap ( )
1145+ } ,
1146+ } ;
1147+
1148+ if let Ok ( region) = Region :: new ( & * self . compositor ) {
1149+ region. add ( 0 , 0 , i32:: MAX , i32:: MAX ) ;
1150+ blur. set_blur ( Some ( & region) )
1151+ } else {
1152+ false
11301153 }
11311154 }
11321155
@@ -1224,10 +1247,6 @@ impl WindowState {
12241247
12251248impl Drop for WindowState {
12261249 fn drop ( & mut self ) {
1227- if let Some ( blur) = self . blur . take ( ) {
1228- blur. release ( ) ;
1229- }
1230-
12311250 if let Some ( fs) = self . fractional_scale . take ( ) {
12321251 fs. destroy ( ) ;
12331252 }
0 commit comments